Sed 将变量从容器开始传递到文件
Dockerfile中有以下几行,我希望在应用程序最后启动之前将配置文件中的值设置为默认值,并在启动容器时使用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_值,并且正确地替换
-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的环境变量(通过排除带有“”的部分)。