如何在if语句中修改Docker ARG变量的值?
在Dockerfile中根据ARG值动态修改构建变量pkg的解决方案
这个问题我之前也踩过坑!核心原因其实是每个RUN指令都会启动一个独立的shell进程,进程之间的环境变量完全隔离。你第一个RUN里修改的pkg只是当前shell的临时变量,到第二个RUN执行时,这个变量早就失效了,自然还是显示初始的master。另外要明确:Docker的ARG是构建阶段的全局变量,你在RUN里操作的是shell本地变量,这俩根本不是同一个东西,没法直接修改ARG的全局值。
给你两个最实用的解决办法:
1. 把命令合并到同一个RUN中
既然变量只在当前shell生效,那我们就把判断和输出放在同一个RUN里,用&&连接命令,让它们在同一个进程中执行:
ARG ver=latest ARG pkg=master RUN if [ "x$ver" = "xv1" ]; then pkg=v1.2.3; fi && echo $pkg
这样执行docker build --build-arg ver=v1 .时,就能正确输出v1.2.3了。
2. 用ARG的条件赋值(更优雅的方式)
如果后续构建步骤也需要用到这个动态设置的pkg值,可以直接在ARG定义时用shell的条件表达式赋值,不用依赖RUN:
ARG ver=latest ARG pkg=$(if [ "x${ver}" = "xv1" ]; then echo "v1.2.3"; else echo "master"; fi) RUN echo $pkg
不过这种方式需要Docker开启BuildKit(大部分新版本默认已开启),如果你的Docker版本较旧,可以在构建时加上前缀:
DOCKER_BUILDKIT=1 docker build --build-arg ver=v1 .
额外提醒:让后续RUN都能访问修改后的pkg
如果需要在多个RUN步骤中使用这个变量,可以把它转成ENV环境变量,持久化到后续镜像层中:
ARG ver=latest ARG pkg=master RUN if [ "x$ver" = "xv1" ]; then export pkg=v1.2.3; fi && echo $pkg && echo "export pkg=$pkg" >> /etc/bash.bashrc # 后续RUN可以直接使用 RUN echo $pkg
不过这种方式需要确保后续shell会加载这个配置文件(比如用bash作为默认shell)。
内容的提问来源于stack exchange,提问作者x y
相关产品推荐
相关产品推荐

