首页/云/云与容器速查/Dockerfile ENV 环境变量
容器与 Docker106 条

Dockerfile ENV 环境变量

把环境变量固化进镜像:后续 RUN 与运行中的容器都能读到,运行时可被 docker run -e 覆盖。适合时区、语言、版本路径等非敏感配置。

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

Dockerfile ENV 是什么

ENV 指令把环境变量固化进镜像:从声明位置之后的 RUN 指令到容器运行时都能读到这些变量,同时它们也会写进镜像的配置元数据。它适合放时区、字符集、应用目录这类非敏感配置,运行时可以用 docker run -e 覆盖。正因为值会保存在镜像配置里,ENV 绝对不能用来存密码、令牌这类密钥。

基本信息

写法ENV KEY=value,或 ENV KEY=value1 KEY2=value2(每行一组更清晰)
作用域镜像内持久生效,后续构建指令与容器进程均可见
运行时覆盖docker run -e KEY=other 优先级更高
与 ARG 区别ARG 只在构建期存在;ENV 进入镜像并对运行期可见
安全红线ENV 值写入镜像元数据,密码与令牌绝不可写

典型使用场景

  • 统一时区与字符集,避免容器内时间、编码与应用预期不符
  • 声明应用根目录,供后续 WORKDIR 与 COPY 指令直接引用
  • 设置运行环境标识(如 APP_ENV=production)供程序内分支判断
  • 配置包管理镜像源这类构建期与运行期都可能需要的变量
  • 给出非敏感默认值(日志级别、监听端口),方便运行期按需覆盖

常用配置与覆盖方式

常用配置与覆盖方式
ENV TZ=Asia/Shanghai \
    LANG=C.UTF-8 \
    APP_HOME=/opt/app
# 后续指令可直接引用变量
WORKDIR $APP_HOME
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
# 运行时按需覆盖,不改变镜像内容
docker run -e APP_ENV=staging -e TZ=UTC myapp:1.0

ENV 与 ARG 对照

维度ENVARG
生效阶段构建期与运行期仅构建期
是否进镜像是,保存在镜像配置中不进运行时环境,但值可见于构建历史
运行时覆盖docker run -e 可以覆盖无法在运行时传入
典型用途时区、字符集、应用目录镜像源、版本号、构建标识
安全建议不写密钥不写密钥,敏感值用 BuildKit --secret
历史镜像里常见 ENV DB_PASSWORD=… 这类写法:docker history 与 docker inspect 谁都能读出来,等同于把凭据公开;已经推送到仓库的镜像只能重建,删除语句无济于事。
同一个构建阶段里 ENV 与 ARG 同名时,ENV 会遮蔽 ARG,后续指令读到的是 ENV 的值,这种冲突会让构建参数看起来『传了却没生效』。

易错点

  • 把密钥写进 ENV,镜像一推仓库即泄露,而且旧层里仍能翻出来
  • ENV KEY = value 写成带空格的形式,被解析成两个变量,值全错
  • ENV 与同名 ARG 混用,构建参数被遮蔽,排查时误以为传参失败
  • ENV 值里带未展开的 shell 变量引用,运行期拿到的不是预期值

数据来源与参考

  • Docker Docs:Dockerfile reference(ENV)

相关工具

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