docker-compose.yml直接读取变量或者基于文件读取.env
1.基于.env在docker-compose.yml读取变量(变量替换)
在 Docker Compose 中,docker-compose.yml 可以直接读取 .env 文件里的环境变量,用于服务配置、端口、镜像标签等。
1.1 默认行为
- 如果
.env文件放在docker-compose.yml同一目录下,Compose 会自动读取其中的变量。 .env文件格式:
# .env
MYSQL_ROOT_PASSWORD=root123
MYSQL_DATABASE=mydb
APP_PORT=5000
- 在
docker-compose.yml中引用:
1 | version: "3.9" |
注意:
${VAR}表示读取.env文件里的变量。- 可以写默认值
${VAR:-default}。
可以用 .env 文件定义镜像名、端口等 Compose 文件中的占位符。
1 | version: "3.9" |
.env:
WEB_IMAGE=mywebapp
WEB_TAG=1.2.3
WEB_PORT=8080
启动:
1 | docker-compose up -d |
- Compose 会自动替换
${WEB_IMAGE},${WEB_TAG},${WEB_PORT}。
1.2. 指定其他 .env 文件
如果 .env 文件不在 docker-compose.yml 同目录,可以用 --env-file 参数:
1 | docker-compose --env-file ./config/myenv.env up -d |
2. env变量注入到系统环境变量中
完全可以,把.env 文件里的变量不仅可以被 docker-compose.yml 用来替换配置,还可以注入到容器内部作为环境变量。关键在于 environment 或 env_file 配置。
2.1. 直接在 environment 注入
1 | version: "3.9" |
- 容器启动后可以通过
echo $DB_PASSWORD在容器内访问。 ${VAR}会从.env文件中解析。
2.2. 使用 env_file
如果 .env 文件中很多变量想直接注入到容器,可以用 env_file:
1 | version: "3.9" |
- 容器内部所有
.env中的变量都会作为环境变量。 - 如果同时使用
environment和env_file,environment中的值会覆盖env_file。
2.3. 容器内部访问验证
1 | docker exec -it <container_name> /bin/sh |
- 可以在启动脚本中直接使用这些环境变量配置应用。
3. 注意事项
.env中不要加空格:VAR=value # 正确 VAR = value # 错误,会被当作字符串.env中不要引用其他变量。Docker Compose 版本 >= 1.28 支持
.env中的默认值替换。