Openshift中的PostgreSQL赢得了';无法执行入口点,无法启动数据库
我们有一个只读的Postgresql数据库,应该在Openshift集群中运行。 我们使用RHEL作为不朽的操作系统。 我们的Dockerfile将安装postgres软件,创建数据库实例,将数据加载到其中,然后关闭数据库并保存图像。 我们只使用bash和sql脚本,并使用flyway部署数据库 当启动容器时,entrypoint脚本将使用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
“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
中,因此将退回到使用grouproot
。由于目录/文件可写入组根目录
,因此一切仍将正常工作。有关更多信息,请参阅:
特别是“支持任意用户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
中,因此将退回到使用grouproot
。由于目录/文件可写入组根目录
,因此一切仍将正常工作。有关更多信息,请参阅:
特别是“支持任意用户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用户添加到该文件中。