在 docker-compose.yml 中用 environment 节点注入环境变量最直观可控,推荐映射式写法;支持宿主机变量引用和 .env 文件透传,但需显式声明,避免硬编码敏感信息。
直接在 docker-compose.yml 的服务定义里用 environment 节点,是最直观、最可控的环境变量注入方式。它不依赖外部文件或宿主机状态,适合非敏感、相对固定的配置。
两种写法:映射式更推荐
支持两种语法,功能一致,但结构不同:
-
映射语法(推荐):可读性强,便于维护,尤其适合变量较多时
services:
web:
image: nginx
environment:
DEBUG: "true"
LOG_LEVEL: "info" -
列表语法:简洁,适合少量变量
environment:
- DEBUG=true
- LOG_LEVEL=info
引用宿主机变量:灵活但需注意空值
可以复用当前 shell 中已设置的变量,避免重复定义:
- 写成
DEBUG:(无等号右侧),表示直接取宿主机的DEBUG值;若未设置,容器内该变量为空字符串 - 写成
DEBUG: ${DEBUG}效果相同,但更明确;也可带默认值:DEBUG: ${DEBUG:-false}
和 .env 文件配合使用:只透传需要的变量
.env 文件里的变量默认只用于 YAML 内插值(比如 image: myapp:${VERSION}),不会自动进容器。要让它生效,必须显式写进 environment:
- 假设
.env有DB_HOST=local-db,则需在 yml 中写:
environment:
- DB_HOST=${DB_HOST} - 这样既集中管理变量来源,又精确控制哪些变量真正暴露给容器
不建议的做法
- 硬编码敏感信息,如
- API_KEY=abc123—— 应改用env_file加密文件 +environment引用 - 混用多种方式却忽略优先级:命令行
-e>environment>env_file,调试时容易误判来源











