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

Sed 将变量从容器开始传递到文件,sed,docker,environment-variables,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_文件中显式地使用了字符串CONFIG_值,并且正确地替换

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_文件中显式地使用了字符串CONFIG_值,并且正确地替换了Dockerfile中的默认值。但是,当我使用添加的
-e CONFIG_VALUE=100运行容器时,不会执行替换,Dockerfile中设置的默认值将保留

当我这样做的时候

docker exec -i -t container_name bash

echo$CONFIG\u VALUE
在容器内,环境变量确实包含所需的值100。

这在Dockerfile中不可能实现:这些指令是静态的,用于生成图像

如果在启动容器时需要运行时指令,则应使用
CMD
指令调用的脚本对其进行编码。

换句话说,
sed
将在
CMD
调用的脚本中发生。当执行
docker run
时,该脚本将有权访问在所述
docker run
之前设置的环境变量,docker文件中的指令在执行
docker build
时会逐行计算,并且不会在运行时重新计算

但是,您仍然可以通过使用入口点脚本来实现这一点,在设置任何环境变量后,将在运行时对其进行评估

例如,您可以定义以下
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"]
请注意,如果您有一个现有入口点,则需要将其与此入口点合并-您只能有一个入口点

现在,您应该发现环境变量得到了尊重,即:

docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE

应按预期工作。

谢谢,您的示例帮助我正确地“转义”了sed的环境变量(通过排除带有“”的部分)。