在 Dockerfile 中定义环境变量最直接的方式是使用 ENV 指令,它在构建时写入镜像并自动生效于容器运行时;敏感信息不可用 ENV 存储;需灵活配置时应结合 ARG 声明构建参数再赋值给 ENV;.env 文件不应硬编码进镜像,而应在启动阶段动态加载。

在 Linux 系统中,Dockerfile 里定义环境变量最直接、最常用的方式是使用 ENV 指令。它会在镜像构建时写入环境变量,容器启动后自动生效,适合设置非敏感的默认配置。
用 ENV 设置固定值
语法简单明确,一行一个变量,或用空格分隔多个键值对:
ENV NODE_ENV=productionENV APP_PORT=3000 LOG_LEVEL=info- 支持变量引用:
ENV BASE_DIR=/app ENV WORKDIR=$BASE_DIR
这类变量会固化在镜像层中,可通过 docker inspect 查看,因此不能存放密码、密钥等敏感信息。
用 ARG + ENV 组合实现构建期可变配置
如果希望变量值在构建时灵活指定(比如不同环境用不同版本),推荐先用 ARG 声明构建参数,再用 ENV 转为运行时变量:
- Dockerfile 中写:
ARG DB_HOST=localhost ENV DB_HOST=$DB_HOST - 构建时传参:
docker build --build-arg DB_HOST=192.168.1.100 -t myapp .
注意:ARG 只在构建阶段有效,必须显式赋值给 ENV 才能在容器运行时被应用读取。
避免把 .env 文件内容硬编码进 Dockerfile
虽然技术上可以通过 --build-arg 配合脚本把本地 .env 文件内容注入,但不推荐。因为这会让敏感值意外进入镜像历史,也违背“构建一次、多环境部署”的原则。真正需要动态加载的 .env,应放在容器启动阶段处理(例如通过自定义 entrypoint 脚本),而不是构建阶段。
验证环境变量是否生效
构建完成后,可以快速检查:
- 运行临时容器并打印:
docker run --rm myapp env | grep APP_PORT - 进容器交互式查看:
docker run -it --rm myapp sh -c 'echo $APP_PORT'
确保应用代码能正确读取这些变量,比如 Node.js 中用 process.env.APP_PORT,Python 中用 os.getenv("APP_PORT")。


















