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 出来的版本和命令行传的一致,产物路径正确,不再出现空版本号。

作者 9823189