7.6 ENV 设置环境变量
7.6.1 基本语法
## 格式一:单个变量
ENV <key>=<value>
## 格式二:多个变量
ENV <key1>=<value1> <key2>=<value2> ...⚠️ 用空格分隔的旧写法
ENV <key> <value>(ARG同理)虽然仍能构建,但已被官方弃用。BuildKit 的 LegacyKeyValueFormat 构建检查会报"ENV key=value" should be used instead of legacy "ENV key value" format,docker buildx build --check(见 10.2)会直接把它标出来。一律用等号。
7.6.2 基本用法
设置单个变量
ENV NODE_VERSION=20
ENV APP_ENV=production设置多个变量
ENV NODE_VERSION=20 \
APP_ENV=production \
APP_NAME="My Application"💡 包含空格的值用双引号括起来。
7.6.3 环境变量的作用
1. 后续指令中使用
2. 容器运行时使用
应用代码中可以读取:
7.6.4 支持环境变量的指令
以下指令可以使用 $变量名 或 ${变量名} 格式:
RUN
RUN echo $VERSION
CMD
CMD ["sh", "-c", "echo $HOME"]
ENTRYPOINT
同上
COPY
COPY . $APP_HOME
ADD
ADD app.tar.gz $APP_HOME
WORKDIR
WORKDIR $APP_HOME
EXPOSE
EXPOSE $PORT
VOLUME
VOLUME $DATA_DIR
USER
USER $USERNAME
LABEL
LABEL version=$VERSION
FROM
FROM node:$NODE_VERSION
注意:
FROM是上表中的特例——它只能引用在第一条FROM之前用ARG声明的变量,无法使用ENV定义的环境变量(ENV要进入构建阶段后才生效)。其余指令才能引用ENV环境变量。
7.6.5 运行时覆盖
使用 -e 或 --env 覆盖 Dockerfile 中定义的环境变量:
.env 文件格式
7.6.6 ENV vs ARG
生效时间
构建时 + 运行时
仅构建时
持久性
写入镜像,运行时可用
构建后消失
覆盖方式
docker run -e
docker build --build-arg
适用场景
应用配置
构建参数(如版本号)
组合使用
7.6.7 最佳实践
1. 统一管理版本号
2. 不要存储敏感信息
3. 为应用提供合理默认值
4. 使用有意义的变量名
7.6.8 常见问题
Q:环境变量在 CMD 中不展开
exec 格式不会自动执行 shell 展开,因此命令参数里的 $PORT 会按字面值传给进程;但环境变量本身仍会注入进程环境,应用可以通过语言运行时读取。
Q:如何查看容器的环境变量
Q:多行 ENV 还是多个 ENV
最后更新于