将变量从容器开始传递到文件

时间:2015-05-17 15:27:55

标签: sed docker environment-variables

我在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。

2 个答案:

答案 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之前访问环境变量集。