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 # 运行时覆盖与构建参数的差别
| 对比项 | 环境变量 | 构建参数 |
|---|---|---|
| 运行期可见 | 可见,进程内可读 | 不可见,仅构建期 |
| 写入镜像配置 | 会写入,可被查看 | 不写入运行时配置 |
| 覆盖方式 | 运行时注入同名变量 | 构建时传入,需要重新构建 |
| 适用内容 | 非敏感的运行配置 | 构建期的版本号、镜像变体 |
| 缓存影响 | 改动会使后续层缓存失效 | 改动同样会影响后续层 |
使用时容易忽略的点
- 变量值里含空格时要注意书写方式,旧式写法会把空格后整串当值
- 改动变量会让它之后的所有层缓存失效,构建时间可能明显增加
- 变量写在启动命令之前还是之后会影响可见性,顺序要理清
- 运行期注入同名的变量会整体覆盖,排查时先确认生效来源
- 敏感值不要写进变量,容器元数据里可以查到
把时区与编码写进镜像能省掉很多琐碎的乱码与时间对不上问题,属于一次投入长期受益的配置。
任何写进镜像的变量都能被查看,包括构建历史与运行配置。凭据类信息必须走挂载文件或专用密钥机制,不能图省事写在这里。