将variables从容器开始传递到文件

我在Dockerfile中有以下几行,我希望在应用程序启动之前将configuration文件中的值设置为默认值,并在启动容器时使用-e选项提供可选的设置。

我正在尝试使用Docker的ENV突击队

  ENV CONFIG_VALUE default_value RUN sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE CMD command_to_start_app 

我在CONFIG_FILE文件中显式地使用了stringCONFIG_VALUE,并且Dockerfile的默认值被正确replace。 但是,当我运行带有-e CONFIG_VALUE=100的容器时,不执行replace,保留在Dockerfile中设置的默认值。

当我做

 docker exec -i -t container_name bash 

并在容器内echo $CONFIG_VALUE环境variables确实包含所需的值100。

这在Dockerfile中是不应该的:这些指令是静态的,用于制作图像。

如果您在启动容器时需要运行时指令,则应将其编码到由CMD指令调用的脚本中。
换句话说, sed会在CMD调用的脚本中进行。 在执行docker run ,该脚本可以访问刚才在docker run之前设置的环境variables。

Dockerfile中的指令是在Docker docker build时逐行进行评估的,在运行时不会重新评估。

您仍然可以通过使用入口点脚本执行此操作,在设置任何环境variables之后,将在运行时对脚本进行评估。

例如,您可以定义以下的entrypoint.sh脚本:

 #!/bin/bash sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE exec "$@" 

exec "$@"将执行任何设置的CMD或命令。

把它添加到Dockerfile例如:

 COPY entrypoint.sh / RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] 

请注意,如果您有现有的入口点,则需要将其与此入口合并 – 只能有一个入口点。

现在你应该发现环境variables是受尊重的,即:

 docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE 

应该按预期工作。