Openshift中的PostgreSQL赢得了';无法执行入口点,无法启动数据库

Openshift中的PostgreSQL赢得了';无法执行入口点,无法启动数据库,postgresql,docker,openshift,openshift-origin,docker-entrypoint,Postgresql,Docker,Openshift,Openshift Origin,Docker Entrypoint,我们有一个只读的Postgresql数据库,应该在Openshift集群中运行。 我们使用RHEL作为不朽的操作系统。 我们的Dockerfile将安装postgres软件,创建数据库实例,将数据加载到其中,然后关闭数据库并保存图像。 我们只使用bash和sql脚本,并使用flyway部署数据库 当启动容器时,entrypoint脚本将使用“pg_ctl”命令简单地启动数据库实例,然后执行无休止的循环以保持容器运行 Dockerfile作为最后一个命令用户26,其中26是postgres用户的i

我们有一个只读的Postgresql数据库,应该在Openshift集群中运行。 我们使用RHEL作为不朽的操作系统。 我们的Dockerfile将安装postgres软件,创建数据库实例,将数据加载到其中,然后关闭数据库并保存图像。 我们只使用bash和sql脚本,并使用flyway部署数据库

当启动容器时,entrypoint脚本将使用
“pg_ctl”
命令简单地启动数据库实例,然后执行无休止的循环以保持容器运行

Dockerfile作为最后一个命令用户26,其中26是postgres用户的id。entrypoint脚本可以作为postgres用户启动,也可以由
sudo用户启动

Docker的一切都很顺利

在Openshift中,容器由属于根组的不同用户启动,但不是根用户或用户26。实际上Openshift忽略Dockerfile中的USER 26子句。 启动容器的用户(我们称之为containeruser)无论如何都没有启动postgres实例的权限,因此在运行entrypoint时,它在postgresql数据文件夹上的权限将被拒绝。 我尝试了不同的选项,将containeruser用户添加到wheel组,修改sudoers文件以允许它使用sudo,并以postgres用户的身份启动入口点,但没有成功。 因此,我已准备好数据库映像,但无法在Openshift中启动它。 在openshift配置端,我们不允许进行更改,例如允许sudo使用,或以root或postgres用户身份启动容器

对这个问题有什么想法或帮助吗? 我不是Openshift专家

谢谢大家!

致以最良好的祝愿, rimetnac

您有两种选择

首选的选择是修复图像,使其可以作为任何用户运行。为此,请不要使用现有的
postgres
用户。创建一个新用户,其中该用户具有组
root
。然后确保PostgreSQL需要写入的所有目录/文件都归该用户所有,但也具有group
根目录,并且可以按组写入。当容器随后启动时,它将作为分配的用户ID运行,而不是在
/etc/passwd
中,因此将退回到使用group
root
。由于目录/文件可写入组
根目录
,因此一切仍将正常工作。有关更多信息,请参阅:

特别是“支持任意用户ID”一节

如果您拥有集群的管理员控制权,并且您的安全团队不反对您覆盖默认安全模型,那么第二个选项是允许您的映像以它想要的用户ID运行

首先创建一个新的服务帐户:

oc create serviceaccount runasnonroot
接下来,授予该服务帐户作为其选择的非根用户ID运行的能力

oc adm policy add-scc-to-user nonroot -z runasnonroot --as system:admin
然后修补部署配置以使用该服务帐户

oc patch dc/mydatabase --patch '{"spec":{"template":{"spec":{"serviceAccountName": "runasnonroot"}}}}'
请注意,这仍然要求您在图像中使用具有整数用户ID的
USER
,而不是
postgres
。否则,它无法验证它是否将作为非root用户运行。这是因为如果您使用用户名而不是用户ID,您可能会恶意地将其映射到root。

您有两种选择

首选的选择是修复图像,使其可以作为任何用户运行。为此,请不要使用现有的
postgres
用户。创建一个新用户,其中该用户具有组
root
。然后确保PostgreSQL需要写入的所有目录/文件都归该用户所有,但也具有group
根目录,并且可以按组写入。当容器随后启动时,它将作为分配的用户ID运行,而不是在
/etc/passwd
中,因此将退回到使用group
root
。由于目录/文件可写入组
根目录
,因此一切仍将正常工作。有关更多信息,请参阅:

特别是“支持任意用户ID”一节

如果您拥有集群的管理员控制权,并且您的安全团队不反对您覆盖默认安全模型,那么第二个选项是允许您的映像以它想要的用户ID运行

首先创建一个新的服务帐户:

oc create serviceaccount runasnonroot
接下来,授予该服务帐户作为其选择的非根用户ID运行的能力

oc adm policy add-scc-to-user nonroot -z runasnonroot --as system:admin
然后修补部署配置以使用该服务帐户

oc patch dc/mydatabase --patch '{"spec":{"template":{"spec":{"serviceAccountName": "runasnonroot"}}}}'

请注意,这仍然要求您在图像中使用具有整数用户ID的
USER
,而不是
postgres
。否则,它无法验证它是否将作为非root用户运行。这是因为如果您使用用户名而不是用户ID,您可能会恶意地将其映射到root。

我花了几天的时间来解决这个问题,并找到了一个很好的解决方案

OpenShift Origin以用户的身份运行由其创建的图像,如OpenShift博客文章中所述。这会阻止程序访问所需的文件和目录。为了在OpenShift Origin上成功运行一个程序,博客文章提供了两种解决方案,但是,第一种方案不适用于PostgreSQL,第二种方案有两个缺点(在注释中解释):

  • 授予组对主程序使用的目录的写访问权
  • 这并不能解决问题,因为尽管任何程序都可以访问PostgreSQL文件,但它们必须归PostgreSQL进程的所有者所有

  • 确保在使用操作系统库查找系统用户时,会返回一个作为用户ID的库,OpenShift Origin将映像运行为。以下是执行此操作的两种方法:

  • 使用一个名为nss_wrapper的包,“它拦截任何查找用户详细信息并返回有效条目的调用。”

  • 使UNIX密码数据库文件(/etc/passwd)在映像生成中具有全局写入权限,以便可以在S2I运行脚本中将OpenShift用户添加到该文件中。