Openshift 中的 PostgreSQL 不会执行入口点并且无法启动数据库

标签 postgresql docker openshift openshift-origin docker-entrypoint

我们有一个应该在 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/

相关文章:

postgresql - 有没有办法继承当前用户不拥有的表

kubernetes - 每个模板字段的 OpenShift/Kubernetes 解释

mysql 在 openshift 上比在旧主机上消耗更多空间

postgresql - 如何使用 GeoTools 从 hstore 列中过滤数据?

postgresql - postgres upsert 的部分更新违反了约束

docker - Windows版Docker是否可用于Windows 10 Enterprise-10586 Build?

sql-server - Docker compose如何在Windows容器上初始化SQL Server DB?

junit - 为什么我的 junit 测试在部署(git push)到 openshift 存储库后被跳过?

sql - Postgres 选择执行顺序不正确

docker : "Error response from daemon: missing signature key"