将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
应该按预期工作。