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