我想以模板变量的形式为 OpenShift 3.9 的基于 PostgreSQL 的专有 Docker 镜像添加一个配置选项 INITDB
.该图像提供了一个由持久存储支持的数据库,从现在开始,数据库应该只在设置该变量(标志)时初始化。
图像是使用 OpenShift 的 Docker 构建策略构建的,并且
PostgreSQL 的 initdb
在 Dockerfile
中调用的 ENTRYPOINT
脚本:因此它会在容器启动时执行。但是,我只想设置一个标志,以便仅在带有标志的容器首次启动时生效。否则可能发生的情况是,数据库在容器首先启动时被初始化(应该是这种情况),但在容器重新启动时也被重新初始化,例如因为迁移到另一个节点(这是不需要的)。
所以我大概需要一些逻辑,脚本将容器的图像 ID 存储在一个文件中,该文件也在持久存储中,其逻辑是调用 initdb
仅当标志被设置时 和 文件不存在或包含另一个图像 ID。
所以也许大致按照这些思路:
file=/mnt/pgdata/image_id
if [ -n "$INITDB" ] && [ $(cat $file) != $image_id]; then
initdb ...
echo $image_id > $file
fi
所以我的问题是:正在运行的容器如何获知其图像的 ID?是否有现成的环境变量(例如 OPENSHIFT_...
——到目前为止我还没有找到)或者它是否必须通过 API?第二种选择似乎可行,因为 oc describe pods
列出“图像 ID”(并且因为 oc explain pod.spec.containers.image
)。但这是否必要/可取?如果是,是否必须提供明确的凭据或容器默认拥有适当的凭据?
我也有兴趣了解 OpenShift 自己的/“官方”PostgreSQL 镜像如何提供此类功能,但尚未找到正确的源代码。
最佳答案
其中一条评论中针对hostname
的建议是中肯的。下面的代码片段现在可以正常使用了:
file=/mnt/pgdata/hostname
if [ -n \"$INITDB\" ] && [ \"$(cat $file)\" != $(hostname) ]; then
initdb ...
echo $(hostname) > $file
fi
关于postgresql - OpenShift 容器如何学习其镜像 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52659933/