我在Dockerfile中有以下几行,我想在应用程序启动之前将配置文件中的值设置为默认值,并在启动时使用-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中显式地显示字符串CONFIG_VALUE,并且Dockerfile中的默认值被正确替换。但是,当我使用添加的-e CONFIG_VALUE=100
运行容器时,不执行替换,将保留Dockerfile中设置的默认值。
当我这样做时
docker exec -i -t container_name bash
容器内的和echo $CONFIG_VALUE
环境变量确实包含所需的值100。
答案 0 :(得分:16)
执行docker build
时,会逐行评估Dockerfile中的说明,并且不会在运行时重新评估。
您仍然可以使用入口点脚本执行此操作,该脚本将在设置任何环境变量后在运行时进行评估。
例如,您可以定义以下entrypoint.sh
脚本:
#!/bin/bash
sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE
exec "$@"
exec "$@"
将执行任何已设置的CMD或命令。
将其添加到Docker文件中,例如:
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
请注意,如果您有一个现有入口点,则需要将其与此入口点合并 - 您只能有一个入口点。
现在您应该发现环境变量是受到尊重的,例如:
docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE
应该按预期工作。
答案 1 :(得分:6)
这在Dockerfile中是不可能的:这些指令是静态的,用于制作图像。
如果在启动容器时需要运行时指令,则应在CMD
指令调用的脚本中对它们进行编码。
换句话说,sed
将发生在CMD
调用的脚本中。在执行docker run
时,该脚本可以在docker run
之前访问环境变量集。