是否可以根据构建ARG
的值有条件地设置Dockerfile中的ENV
变量?
例如:Something like
ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
字符串
更新:当前使用基于马里奥的答案:
ARG BUILD_ENV=prod
ENV NODE_ENV=production
RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi
型
但是,使用--build-arg BUILD_ENV=test
运行,然后转到主机上,我仍然会得到
docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production
型
8条答案
按热度按时间qmelpv7a1#
是的,这是可能的,但你需要使用你的构建参数作为标志。您可以使用shell的参数扩展功能来检查条件。下面是一个概念验证的Docker文件:
字符串
测试构建:
型
5f0d552i2#
您不能直接在 Dockerfile 中运行bash代码,但必须使用
RUN
命令。例如,您可以使用RUN
更改ENV
并导出if
中的变量,如下所示:字符串
我没试过,但应该可以。
hzbexzde3#
虽然你不能设置条件
ENV
变量,但你可以使用RUN
命令和一个null-coalescing环境变量来完成你的任务:字符串
3npbholx4#
你的逻辑其实是正确的。这里的问题是,
RUN export ...
在Dockerfile中无法工作,因为export
命令不会跨映像持久化。Dockerfiles创建了一个临时容器来生成镜像,因此环境变量将不存在。ENV
另一方面,根据文档规定:使用
ENV
设置的环境变量将在从结果映像运行容器时保持不变。唯一的方法是在
docker run
命令中从镜像生成容器,并将逻辑 Package 在其周围:字符串
oyt4ldly5#
如果我们只讨论环境变量,那么就用生产环境来设置它
字符串
在开发的容器启动过程中,您可以使用
-e NODE_ENV=dev
。这种方式映像总是内置在生产中,但本地容器在开发中启动。
exdqitrt6#
如果您只需要检查build-arg是否存在,并且希望设置默认值,则answer非常有用。为了改进这个解决方案,如果你想使用build-arg传递的数据,你可以执行以下操作:
字符串
神奇的是ARG的默认值。
pn9klfpd7#
将值传递到Dockerfile,然后传递到entrypoint脚本
从命令行传入所需的值(TARG)
字符串
然后在你的
Dockerfile
中放入类似这样的内容型
entrypoint.sh
脚本只读取第一个参数型
ubbxdtey8#
我在容器上设置代理服务器时遇到了类似的问题。
我使用的解决方案是一个入口点脚本和另一个用于环境变量配置的脚本。使用RUN可以确保配置脚本在构建时运行,而在运行容器时使用ENTRYPOINT。
--build-arg用于命令行设置代理用户和密码。
入口点脚本如下所示:
字符串
configproxy.sh
型
在Dockerfile中,配置:
型
生成时不使用代理设置
型
使用代理设置生成
型
看看here。