在 Docker 中,配置和管理环境变量是非常常见的需求,用于传递配置参数、控制服务行为、实现环境隔离(如开发/测试/生产)。下面从镜像构建、容器运行、Docker Compose、.env 文件等角度全面讲解:
一、在 Dockerfile 中设置环境变量
使用 ENV
指令设置环境变量:
FROM alpine
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
ENV APP_ENV=production
这些变量在容器构建时和运行时都可用。
二、在 docker run
时传入环境变量
1. 使用 -e
传递单个变量:
docker run -e APP_ENV=dev -e TZ=Asia/Shanghai my-image
2. 使用 --env-file
加载多个变量:
创建 .env
文件(每行一个):
APP_ENV=dev
TZ=Asia/Shanghai
DB_HOST=127.0.0.1
DB_USER=root
然后运行容器时加载:
docker run --env-file .env my-image
三、在 docker-compose.yml
中配置环境变量
方法 1:直接在 environment:
中配置
services:
app:
image: my-app
environment:
- APP_ENV=dev
- DB_HOST=localhost
方法 2:引用 .env
文件(自动读取)
.env
文件内容:
APP_ENV=production
DB_HOST=db.local
Compose 文件中直接使用 ${VAR}
:
services:
app:
image: my-app
environment:
- APP_ENV=${APP_ENV}
- DB_HOST=${DB_HOST}
注意: Compose 默认会自动读取同目录下的
.env
文件(无需额外指定)。
四、容器内部如何读取环境变量?
进入容器后使用:
docker exec -it my-container sh
# 查看环境变量
env
# 读取单个变量
echo $APP_ENV
五、注意事项与最佳实践
问题 | 建议 |
---|---|
🧪 敏感信息(如密码) | ❌ 避免写在 Dockerfile,建议运行时注入或用 Secret 管理 |
📂 多环境配置 | 使用 .env.dev , .env.prod 区分不同环境 |
⚙️ 配置优先级 | docker run -e > ENV in Dockerfile |
🔄 修改变量重启容器 | 变量更改后必须重启容器才生效 |
六、查看和调试容器中的环境变量
查看运行中容器的环境变量:
docker inspect <容器名> | grep -A 10 "Env"
示例输出:
"Env": [
"APP_ENV=dev",
"TZ=Asia/Shanghai"
]
七、环境变量注入 Java 程序(示例)
在 Spring Boot 项目中配置:
@Value("${APP_ENV}")
private String appEnv;
启动参数中注入:
docker run -e APP_ENV=dev my-spring-app
总结
场景 | 用法 |
---|---|
Dockerfile 中写死变量 | ENV KEY=value |
启动时传变量 | -e KEY=value or --env-file |
Compose 配置变量 | environment: + .env 文件 |
动态配置/安全注入 | 推荐外部传入,不写死在镜像中 |
如果你需要:
✅ 在 Docker 容器中读取数据库配置、环境标识等,
✅ 使用 .env
文件多环境切换,
✅ 或你想让 Java 程序读取环境变量作为配置,