首页/云/云与容器速查/Dockerfile ARG 构建期变量
容器与 Docker106 条

Dockerfile ARG 构建期变量

只在构建期存在的参数:用 docker build --build-arg 传入,可给默认值。多阶段构建中每个阶段需重新声明;值会留在构建历史里,不能放密钥。

云与容器速查云更新于 2026-10-13

Dockerfile ARG 是什么

ARG 声明只在构建期存在的变量,通过 docker build --build-arg 传入,也可以给默认值。它适合镜像源、版本号、构建标识这类随环境变化的参数。两个要点:多阶段构建里每个阶段都要重新声明,声明之前的指令无法引用;ARG 的值会出现在构建历史与失败日志中,所以不能用它传递密码或令牌,敏感数据应改用 BuildKit 的 secret 挂载机制。

基本信息

语法ARG NAME[=默认值],配合 docker build --build-arg NAME=值
作用域从声明处到该构建阶段结束;多阶段构建每个阶段需重新声明
与 ENV 关系ARG 仅构建期有效;ENV 持久进入镜像,可被 ARG 赋值
安全边界值可从构建历史读出,敏感数据使用 BuildKit --secret
内置参数代理类参数需要先在 Dockerfile 中声明才会被构建命令采用

典型使用场景

  • 切换包管理镜像源:内网环境与公网环境使用不同的源地址
  • 注入构建版本号与提交号,让程序内部能打印出准确的版本信息
  • 多阶段构建中传递产物路径或编译开关,同一份文件支持不同构建形态
  • 为不同目标架构传递平台相关参数,配合 buildx 构建多架构镜像
  • CI 流水线把分支或构建编号作为参数写入镜像标识,便于追溯来源

镜像源参数示例

镜像源参数示例
# Dockerfile
ARG NPM_REGISTRY=https://registry.npmmirror.com
RUN npm config set registry "$NPM_REGISTRY"

# 构建时覆盖
docker build --build-arg NPM_REGISTRY=https://registry.npmjs.org -t app:dev .

多阶段重新声明

多阶段重新声明
FROM node:20 AS build
ARG BUILD_VERSION=0.0.0   # 第一阶段声明
RUN echo $BUILD_VERSION > /tmp/version

FROM nginx:1.27
ARG BUILD_VERSION   # 新阶段必须重新声明才能引用,取值仍来自 --build-arg
RUN echo $BUILD_VERSION > /usr/share/nginx/html/version.txt

ARG 与 ENV 对照

维度ARGENV
生效阶段仅构建期构建期与运行期
是否进镜像配置不进运行环境,但值可见于构建历史保存在镜像配置中
运行时传入不支持docker run -e 可覆盖
典型用途镜像源、版本号、构建标识时区、字符集、应用目录
敏感值不可用,改用 secret 机制不可用
构建失败信息里会回显 ARG 的值:CI 日志中带令牌的构建参数会连同报错一起泄露,敏感数据必须改用 secret 挂载方式传入。
内置构建参数(例如代理相关变量)需要先在 Dockerfile 中用 ARG 声明才会被采用;未声明时即使构建命令传了参数,也不会影响构建过程。

易错点

  • 在第二阶段直接引用第一阶段声明的参数:报变量未定义,需要在每个阶段重新声明
  • ARG 与 ENV 同名时被遮蔽:后续指令读到的是 ENV 的值,构建参数看起来没有生效
  • 把令牌通过 --build-arg 传入,值留在构建历史与 CI 日志中,等于公开泄露
  • 完全依赖默认值兜底,构建命令漏传参数也会构建成功,问题在运行期才暴露

数据来源与参考

  • Docker Docs:Dockerfile reference(ARG)
  • Docker Docs:Build secrets

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌