Docker镜像构建阶段注入配置需用ARG接收构建参数、ENV固化为运行时变量:ARG仅构建期有效且不存入镜像,ENV写入镜像层供容器使用;敏感信息严禁用ENV,应通过docker run -e或--env-file运行时注入。

在 Docker 镜像构建阶段注入配置,核心是用 ARG 和 ENV 指令配合使用:ARG 负责接收构建时传入的值,ENV 负责将其固化为镜像内可用的环境变量。
用 ARG 接收构建参数
ARG 是构建上下文中的“临时变量”,只在 docker build 过程中有效,不会出现在最终镜像里——这保证了敏感信息或动态值(如 Git 分支、构建时间)不被意外留存。
- 在 Dockerfile 中声明:
ARG BUILD_VERSION,可设默认值:ARG BUILD_VERSION=0.1.0 - 构建时传入:
docker build --build-arg BUILD_VERSION=1.2.3 -t myapp . - 注意:ARG 不能直接被容器运行时读取,必须显式转成 ENV 才能生效
用 ENV 固化运行时环境变量
ENV 定义的变量会写入镜像层,成为所有基于该镜像启动的容器的默认环境变量。它适合设置非敏感、跨环境一致的配置,比如语言区域、默认端口、日志级别。
- 直接写死:
ENV NODE_ENV=production - 结合 ARG 赋值:
ARG APP_VERSION→ENV APP_VERSION=${APP_VERSION} - 多个 ENV 可分行写,也可用空格分隔:
ENV TZ=Asia/Shanghai LANG=C.UTF-8 - ⚠️ 切勿用 ENV 存密码、密钥等敏感信息——
docker inspect或docker history可直接看到
构建时动态生成配置文件(进阶技巧)
当某些配置需在构建阶段生成(如带版本号的 config.json),可用 RUN 指令配合 ARG/ENV 实现:
- 例如:
RUN echo "{\"version\":\"${APP_VERSION}\",\"env\":\"${NODE_ENV}\"}" > /app/config.json - 这样生成的文件随镜像分发,应用启动时直接读取,无需运行时再拼接
- 适用于构建时已知、且不随部署环境变化的元数据类配置
与运行时配置的分工要清晰
构建阶段的变量(ARG+ENV)解决的是“这个镜像是什么版本、默认跑在哪种模式”的问题;而数据库地址、API 密钥等“这个容器要连哪个实例”的问题,应留给 docker run -e 或 --env-file 在启动时注入。
- 镜像越通用,构建阶段越少硬编码具体值
- 推荐模式:Dockerfile 用 ARG 接收版本/标签,用 ENV 设默认行为;敏感和差异化配置全部推迟到运行时


















