FROM 结合 ARG 参数化
在 FROM 之前声明 ARG,把基础镜像写成变量,构建时用 --build-arg 切换镜像或版本,一份 Dockerfile 就能适配多个基础镜像。需要同时支持多个发行版或替换为内网镜像地址时,这种写法最省事。
基本信息
| 用途 | 让基础镜像可配置 |
|---|---|
| 语法 | ARG BASE=node:20-alpine 后接 FROM ${BASE} |
| 传参 | docker build --build-arg BASE=node:22-alpine . |
| 作用域 | FROM 之前声明的 ARG 只对 FROM 行有效 |
| 阶段内复用 | 需要在阶段内使用同名变量时必须再声明一次 |
典型使用场景
- 同一份文件支持多个基础镜像版本,升级时只改构建参数
- 内网环境把基础镜像换成内部仓库地址,代码里不留内网信息
- 多架构构建时按平台选择对应的基础镜像
- 排查变量没传进来导致 FROM 报错:核对作用域与拼写
- 统一团队构建入口,把基础镜像版本集中在流水线参数里
- 灰度验证新基础镜像:先用参数构建一份镜像做行为对比
示例
示例
ARG BASE=node:20-alpine
FROM ${BASE}
WORKDIR /app
# 阶段内还要用这个变量时必须重新声明
ARG BASE
RUN printf 'base=%s\n' "$BASE" > /app/BASE
# 构建命令
docker build --build-arg BASE=node:22-alpine -t app/web:dev .ARG 在 FROM 前后的作用域
| 声明位置 | 可用于 | 是否进入镜像配置 |
|---|---|---|
| FROM 之前 | FROM 行,用于选择基础镜像 | 否 |
| FROM 之后 | 该阶段的指令 | 否 |
| 阶段内重新声明 | 当前阶段的后续指令 | 否 |
| 改用 ENV | 容器运行环境 | 是 |
FROM 之前的 ARG 只服务于基础镜像选择,进入阶段后要再用同名变量必须重新声明,否则会取到空值。
默认值会固化在 Dockerfile 里,把默认值设成团队常用版本,同时在流水线显式传参,避免长期依赖隐式默认值。
切换基础镜像版本会带来依赖与系统库差异,切版本时至少跑一次完整构建加冒烟验证,不能只看构建是否成功。
构建日志会打印本次实际使用的基础镜像与摘要,排查版本类问题时先看这一行,比翻 Dockerfile 更快确认到底用了哪个镜像。