我想以模板变量INITDB
的形式向OpenShift 3.9的基于PostgreSQL的专有Docker镜像添加配置选项。该映像提供了一个由持久性存储支持的数据库,从现在开始,只有在设置了该变量(标志)时,才应初始化该数据库。
该图像是使用OpenShift的Docker构建策略构建的,
在initdb
的{{1}}脚本中调用PostgreSQL的Dockerfile
:因此,只要容器启动,它就会执行。但是我只想设置标志仅在标记容器第一次启动时才起作用。否则可能发生的情况是,当容器首先启动时(应该是这种情况),数据库被初始化,但是当容器重新启动时,数据库也被重新初始化,例如因为迁移到另一个节点(这是不必要的)。
因此,我大概需要一些逻辑,以便脚本将容器的图像ID也以逻辑存储在持久性存储中的文件中,以便仅在设置了和标志时才调用ENTRYPOINT
。文件不存在或包含其他图像ID。
所以也许大致符合这些原则:
initdb
所以我的问题是这样的:正在运行的容器如何了解其图像的ID?是否有现成的环境变量(例如file=/mnt/pgdata/image_id
if [ -n "$INITDB" ] && [ $(cat $file) != $image_id]; then
initdb ...
echo $image_id > $file
fi
-到目前为止我还没有找到)还是必须通过API?第二种选择似乎可行,因为OPENSHIFT_...
列出了“图像ID”(并且由于oc describe pods
)。但是是否有必要/建议?如果是这样,那么在默认情况下,是否必须提供显式凭证或容器是否拥有适当的凭证?
我还想了解OpenShift自己的/“官方” PostgreSQL映像如何提供这种功能,但还没有找到正确的源代码。
答案 0 :(得分:0)
其中一项评论中对hostname
的建议是正确的。现在,以下代码可以正常工作:
file=/mnt/pgdata/hostname
if [ -n \"$INITDB\" ] && [ \"$(cat $file)\" != $(hostname) ]; then
initdb ...
echo $(hostname) > $file
fi