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

tco*_*o25 8 sed environment-variables docker

我在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
Run Code Online (Sandbox Code Playgroud)

我在文件CONFIG_FILE中显式地显示字符串CONFIG_VALUE,并且Dockerfile中的默认值被正确替换.但是,当我运行带有添加的容器时,-e CONFIG_VALUE=100不执行替换,将保留Dockerfile中设置的默认值.

当我做

docker exec -i -t container_name bash
Run Code Online (Sandbox Code Playgroud)

echo $CONFIG_VALUE容器内的环境变量确实包含所需的值100.

Adr*_*uat 16

当您执行此操作时,将逐行评估Dockerfile中的指令,docker build并且不会在运行时对其进行重新评估.

但是,您仍然可以使用入口点脚本执行此操作,该脚本将在设置任何环境变量后在运行时进行评估.

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

#!/bin/bash

sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE
exec "$@"
Run Code Online (Sandbox Code Playgroud)

exec "$@"将执行设定任何CMD或命令.

将它添加到Dockerfile,例如:

COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

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

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

docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE
Run Code Online (Sandbox Code Playgroud)

应该按预期工作.


Von*_*onC 6

这在Dockerfile中是不可能的:这些指令是静态的,用于制作图像.

如果在启动容器时需要运行时指令,则应该在CMD指令调用的脚本中对它们进行编码.
换句话说,sed将发生在被CMD调用的脚本中.在执行此操作时docker run,该脚本可以在上述之前访问环境变量集docker run.