首页/云/Docker 容器速查/ARG 构建期变量与 --build-arg
镜像与构建107 条

ARG 构建期变量与 --build-arg

声明只在构建期存在的变量,用 --build-arg 传入值或使用默认值;不会进入运行环境,适合版本号、下载地址等构建参数。

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

ARG 是什么

ARG 声明只在构建期存在的变量,值由 docker build --build-arg 传入,没传就取默认值。它和 ENV 的关键差别是不写进运行环境,适合放版本号、内网源地址、编译开关这类构建参数。

基本信息

用途构建期参数,不进入容器运行环境
语法ARG NAME[=默认值],构建时 docker build --build-arg NAME=值
作用域只在声明它的构建阶段内有效,跨阶段要各自声明
与 ENV 的差别ENV 会写进镜像配置并成为运行环境变量,ARG 不会
特殊位置写在 FROM 之前的 ARG 供 FROM 行使用

典型使用场景

  • 同一份 Dockerfile 构建不同版本:APP_VERSION 由 CI 传入,产物里的版本号与镜像标签保持一致
  • 构建机在内网时传 MIRROR 与代理地址,公开代码里不留内部地址
  • 用编译开关区分调试与生产:dev 带调试符号,prod 开裁剪
  • 参数化基础镜像版本:ARG BASE=node:20-alpine 后接 FROM ${BASE},一个文件适配多个版本
  • 复现历史构建:把当时用到的 build-arg 值记进流水线日志,换机器也能复刻

示例

示例
# Dockerfile
ARG APP_VERSION=dev                      # 未传值时的默认值
ARG MIRROR=https://mirrors.example.com   # 内网源地址
RUN printf 'version=%s\n' "$APP_VERSION" > /app/VERSION

# 构建命令
docker build --build-arg APP_VERSION=1.4.2 -t app/web:1.4.2 .
docker build --build-arg APP_VERSION --build-arg MIRROR .   # 直接取当前环境变量

ARG 与 ENV 对照

维度ARGENV
存活范围仅构建期构建期与容器运行期
是否进镜像配置不进镜像配置,但值会记入构建历史写进镜像配置,docker inspect 可见
可否被覆盖构建时用 --build-arg 覆盖运行时用 docker run -e 覆盖
典型用途版本号、镜像源、编译开关应用配置、PATH、时区
缓存影响值变化会让后续层缓存失效同样影响缓存,但会成为运行环境
漏传值的 ARG 会静默取默认值,构建不会报错,脚本里忘了传参数就会产出看似正常的错误版本;CI 里最好显式断言版本号或摘要。
--build-arg 传的值会记录在镜像构建历史里,docker history 就能看到原文,任何口令、token 都不要走 ARG。

易错点

  • 把密钥放进 ARG 再在 RUN 里引用,值会留在镜像历史里,改从 RUN --mount=type=secret 传入才是正路
  • 多阶段构建里 ARG 只在声明它的阶段有效,第二个阶段不重新声明会得到空值,变量拼出来的地址直接缺一截
  • 把高频变化的参数放在 Dockerfile 靠前位置,改一次就让后面所有层缓存失效,构建时间明显变长
  • 默认值里写死临时地址或内部参数,短期图方便,之后每次构建都带着它,排查问题时容易被忽略

数据来源与参考

  • Docker 官方文档:Dockerfile ARG(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌