首页/云/Docker 容器速查/ENV 设置环境变量
镜像与构建107 条

ENV 设置环境变量

定义镜像内持久环境变量:构建后续指令与容器运行时都可见,是配置镜像行为与固定时区/编码的常规手段。

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

ENV 是什么

在镜像里声明持久环境变量:后续构建指令能看到它,容器启动后进程也能看到它。它适合放与镜像行为绑定的非敏感配置,例如时区、编码、运行模式。运行时可再注入同名变量覆盖镜像里的值,方便同一镜像跑不同环境。

基本信息

语法用等号连接键值,一行可以写多个赋值
生效范围构建阶段后续指令与运行期进程
覆盖方式运行时注入同名变量可覆盖镜像里的值
常见用途时区、语言与编码、运行模式、默认端口
不宜存放口令、令牌等敏感信息,会随镜像一起分发

典型使用场景

  • 固定时区:避免日志时间与应用时间错位,排查时对不上监控
  • 设置语言与编码:防止中文与特殊字符输出乱码
  • 指定运行模式:让框架以生产模式启动,关闭调试输出
  • 统一默认值:给未注入的环境提供可用的默认配置
  • 构建期传参:让后续指令按变量分支执行不同的配置步骤

常用示例

常用示例
ENV NODE_ENV=production                # 设定运行模式
ENV LANG=C.UTF-8 TZ=Asia/Shanghai      # 一行写两个变量
RUN echo "mode=$NODE_ENV" > /tmp/probe.txt   # 构建期可读取
LABEL org.opencontainers.image.title="web"   # 元数据用标签而不是变量
docker run -e NODE_ENV=development app/web:1.0   # 运行时覆盖

与构建参数的差别

对比项环境变量构建参数
运行期可见可见,进程内可读不可见,仅构建期
写入镜像配置会写入,可被查看不写入运行时配置
覆盖方式运行时注入同名变量构建时传入,需要重新构建
适用内容非敏感的运行配置构建期的版本号、镜像变体
缓存影响改动会使后续层缓存失效改动同样会影响后续层

使用时容易忽略的点

  • 变量值里含空格时要注意书写方式,旧式写法会把空格后整串当值
  • 改动变量会让它之后的所有层缓存失效,构建时间可能明显增加
  • 变量写在启动命令之前还是之后会影响可见性,顺序要理清
  • 运行期注入同名的变量会整体覆盖,排查时先确认生效来源
  • 敏感值不要写进变量,容器元数据里可以查到
把时区与编码写进镜像能省掉很多琐碎的乱码与时间对不上问题,属于一次投入长期受益的配置。
任何写进镜像的变量都能被查看,包括构建历史与运行配置。凭据类信息必须走挂载文件或专用密钥机制,不能图省事写在这里。

易错点

  • 用旧式写法声明变量,空格后的内容被当成值的一部分,应用读到意料之外的配置
  • 把口令写进镜像变量,任何拿到镜像的人都能读出来
  • 改一个变量导致后面所有层缓存失效,构建时间突然变长找不到原因
  • 构建期与运行期都设了同一个变量,排查时没确认来源,结论互相矛盾

数据来源与参考

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