ARG VERSION=dev FROM alpine:3.19 ARG VERSION RUN echo build=$VERSION docker build --build-arg VERSION=1.2.3 -t app:1 .
命令行 `–build-arg VERSION=1.2.3` 传了值,进到 RUN echo $VERSION 打出来却是空的,产物文件名变成 app-.tar.gz,换成 ENV 写死又一切正常,日志里看不出任何异常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:ARG 只在声明它的那个阶段有效,写在第一个 FROM 之前的值不会自动带进后续阶段,每个阶段都得重新声明一次才能取到,少写一行就永远是空值。
「Dockerfile ARG 作用域」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
处理上按这个顺序:在每个 FROM 之后都重新写一遍 ARG 声明 一个阶段都不能省;需要跨阶段使用的值改成 ENV 落进镜像 别指望自动继承;构建参数和运行时变量分开管 别用同名混着写。
确认没问题再收工,构建日志里 echo 出来的版本和命令行传的一致,产物路径正确,不再出现空版本号。
