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

How to create a properties file via Dockerfile with dynamic values passed in docker run?

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

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

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

buildMode=true
source=/path1

我想动态地向这个文件提供值,例如:

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

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

注意: 基础镜像是linuxcentos.

如您所料,您需要在 运行 时创建实际文件。在 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) 来完成类似的技巧,它更普遍可用,但可能需要更棘手的正则表达式。