postgresql - OpenShift 容器如何学习其镜像 ID?

标签 postgresql docker openshift

我想以模板变量的形式为 OpenShift 3.9 的基于 PostgreSQL 的专有 Docker 镜像添加一个配置选项 INITDB .该图像提供了一个由持久存储支持的数据库,从现在开始,数据库应该只在设置该变量(标志)时初始化。

图像是使用 OpenShift 的 Docker 构建策略构建的,并且 PostgreSQL 的 initdbDockerfile 中调用的 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/

相关文章:

java - 如何为 JavaEE 应用程序中的 PostgreSQL 热备设置配置连接故障转移?

mongodb - 微服务应用程序......数据库的 Docker 卷或没有 Docker 卷?

docker - 如何使用 docker-compose 设置主机名?

docker - Docker上的ElasticSearch集群

git - 从 RHC 中删除 Openshift 服务器

postgresql - 如何为列中的每个不同元素仅选择两行 (PostgreSQL 9.3.5)

postgresql - 使用 postgres 添加天数到间隔

php - Openshift 应用程序默认返回 php 5.3

openshift - rhc 设置未定义方法 `[]' 为 nil :NilClass

postgresql - PostgreSQL 单查询执行不是原子的吗?