如何通过 Dockerfile 使用 docker run 中传递的动态值创建属性文件?

Posted

技术标签:

【中文标题】如何通过 Dockerfile 使用 docker run 中传递的动态值创建属性文件?【英文标题】:How to create a properties file via Dockerfile with dynamic values passed in docker run? 【发布时间】:2019-06-22 19:44:02 【问题描述】:

我对 Docker 比较陌生。也许这是一个愚蠢的问题。

我的目标是创建一个具有system.properties 文件的图像,顾名思义,它是一个带有键值对的属性文件。 我想动态地填充这个文件中的值。所以我认为这些值需要作为环境变量传递给 Docker 运行命令。

例如,如果这是我想要的 system.properties 文件中的内容:

buildMode=true
source=/path1

我想动态地为这个文件提供值,比如:

$ docker run -e BUILD_MODE=true -e SOURCE='/path1' my_image

但我不知道如何将值复制到文件中。任何帮助将不胜感激。

注意:基础镜像是 linux centos。

【问题讨论】:

【参考方案1】:

正如您所怀疑的,您需要在运行时创建实际文件。在 Docker 中有用的一种模式是编写一个专门的入口点脚本来执行任何所需的设置,然后启动主容器命令。

如果您使用的是“更大”的 Linux 发行版库,envsubst 是一个有用的工具。 (它是 GNU 工具集的一部分,默认情况下在 Alpine 基础映像上不可用,但在 CentOS 上应该可用。)您可以编写一个模板文件:

buildMode=$BUILD_MODE
source=$SOURCE

然后您可以将该模板复制到您的图像中:

...
WORKDIR /app
COPY ...
COPY system.properties.tmpl ./
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["java", "-jar", "app.jar"]

入口点脚本需要运行envsubst,然后继续运行命令:

#!/bin/sh
envsubst <system.properties.tmpl >system.properties
exec "$@"

您可以只使用 sed(1) 来实现类似的技巧,它更普遍可用,但可能需要更复杂的正则表达式。

【讨论】:

谢谢 - 将文件复制到 APP 目录是有意义的。

以上是关于如何通过 Dockerfile 使用 docker run 中传递的动态值创建属性文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Docker 镜像里提取 dockerfile!

以编程方式从Dockerfile中删除与docker build相关联的docker镜像

Docker学习笔记-- 如何使用Dockerfile构建镜像

docker安装postgres镜像&&如何通过Dockerfile使之在运行镜像时初始化数据

10.Docker-----安装初步使用镜像Dockerfile常用指令通过Dockerfile文件封装nginx镜像并优化

Docker学习笔记-- 如何使用Dockerfile构建镜像