核心是分清变量生命周期:构建时用arg,运行时用env。arg仅存于构建过程且支持默认值,通过--build-arg或--build-arg-file传参;env由arg赋值后固化进镜像,避免硬编码敏感信息;可调用shell命令注入动态值如时间戳、git信息。

核心是分清变量生命周期:构建时用 ARG,运行时用 ENV,二者配合才能让同一镜像在不同环境安全复用。
构建阶段传参:用 ARG 接收可变输入
ARG 只存在于构建过程,不会写入最终镜像,适合传入环境标识、版本号等非敏感参数:
- 在 Containerfile / Dockerfile 中声明:
ARG APP_ENV=dev - 支持默认值,避免构建命令漏传导致失败
- 构建时覆盖:
docker build --build-arg APP_ENV=prod -t myapp .
运行时固化配置:用 ENV 转换并生效
ENV 会写入镜像层,成为容器启动后的默认环境变量,但必须由 ARG 显式赋值,而非硬编码:
- 写法示例:
ENV NODE_ENV=${APP_ENV}(注意用花括号,防拼接错误) - 这样生成的镜像里,
NODE_ENV是固定值,而APP_ENV不残留 - 避免直接写
ENV DB_PASSWORD=xxx——敏感值会留在镜像历史中
批量管理多变量:用 --build-arg-file 加载配置文件
当参数超过 3–4 个,命令行传参易错难维护。可用纯文本文件统一管理:
- 准备
build.env,每行一个KEY=VALUE:API_URL=https://api.prod.example.com<br>LOG_LEVEL=warn
- 构建命令:
docker build --build-arg-file build.env -t app:latest . - 注意:Containerfile 中仍需对应写
ARG API_URL和ENV API_URL=${API_URL}
注入构建时动态值:用 shell 命令生成时间戳或 Git 信息
某些值无法提前写死,但又需要固化进镜像用于追踪或调试:
- 在 Containerfile 中直接调用宿主机命令:
ENV BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")<br>ENV GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
- 这些命令在构建机上执行,需确保安装了
git、date等工具 - 生成的值会进入镜像,适合做版本标识,但不适用于密钥类敏感数据











