我们有一个应该在 Openshift 集群中运行的只读 Postgresql 数据库。 我们使用 RHEL 作为底层操作系统。 我们的 Dockerfile 将安装 postgres 软件,创建数据库实例,将数据加载到其中,然后关闭数据库并保存图像。 我们仅使用 bash 和 sql 脚本并使用 flyway 部署数据库。
启动容器时,入口点脚本将简单地使用“pg_ctl”
命令启动数据库实例,然后执行无限循环以保持容器运行。
Dockerfile 的最后一个命令是 USER 26,其中 26 是 postgres 用户的 ID。入口点脚本可以作为 postgres 用户或 sudo 用户
启动。
一切都在 Docker 中运行良好。
在 Openshift 中,容器由属于根组的不同用户启动,但既不是根用户也不是用户 26。实际上,Openshift 忽略了 Dockerfile 中的 USER 26 子句。 启动容器的用户(我们称之为 containeruser)无论如何都没有启动 postgres 实例的权限,因此在运行入口点时,它将获得对 postgresql 数据文件夹的拒绝权限。 我尝试了不同的选项,将 containeruser 用户添加到 wheel 组并修改 sudoers 文件以允许它使用 sudo 并以 postgres 用户身份启动入口点但没有成功。 所以我准备好了我的数据库镜像,但无法在 Openshift 中启动它。 在 openshift 配置方面,我们不允许进行更改,例如允许使用 sudo,或以 root 或 postgres 用户身份启动容器。
对这个问题有什么想法或帮助吗? 我不是 Openshift 专家。
谢谢!
最好的问候, 雷美萘
最佳答案
你有两个选择。
首选是修复您的图像,以便它可以作为任何用户运行。为此,不要使用现有的 postgres
用户。创建一个新用户,该用户拥有 root
组。然后确保 PostgreSQL 需要写入的所有目录/文件都属于该用户,但也有组 root
并且可以由组写入。当容器随后启动时,它将作为分配的用户 ID 运行,而不是在 /etc/passwd
中,因此将回退到仍然使用组 root
。因为目录/文件对组 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 中的 PostgreSQL 不会执行入口点并且无法启动数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49653813/