Docker Compose环境变量优先级从高到低为:1.docker run -e命令参数;2.docker-compose.yml中environment字段;3.env_file加载的文件;4.宿主机环境变量;.env文件仅用于YAML内占位符替换,不直接注入容器。
用好环境变量注入,是 docker 多环境配置的核心。关键不在于堆砌方式,而在于分清用途、理清优先级、避免混用。
三种主流注入方式各司其职
不是所有方式都适合所有场景,选对才省心:
-
直接写在 docker-compose.yml 的 environment 下:适合非敏感、固定值,比如
APP_ENV=production或LOG_LEVEL=info。它优先级最高,能覆盖其他来源,但别往里塞密钥或地址。 -
用 env_file 加载 .env 文件:适合批量管理基础配置,比如数据库名、端口、路径等。文件内容必须是
KEY=value格式(不能有空格),支持注释和空行。推荐按环境拆成.env.dev、.env.prod等,启动时用--env-file指定。 -
引用宿主机环境变量(${VAR_NAME}):适合动态传参,比如密钥、临时开关。宿主机需提前
export SECRET_API_KEY=xxx,然后在 compose 文件中写- API_KEY=${SECRET_API_KEY}。这种方式不会被 .env 文件覆盖,安全性更高。
默认 .env 文件自动生效,但别依赖它做多环境切换
Docker Compose 启动时会自动读取项目根目录下的 .env 文件,并把里面的内容用于替换 YAML 中的 ${VAR} 占位符(例如 ports: - "${PORT}:80")。但它只影响 compose 文件本身的变量解析,不直接注入容器环境 —— 容器里能不能用,还得看是否通过 environment 或 env_file 显式传递过去。
所以,.env 更适合作为“编排参数”的源头,而不是“运行时配置”的主渠道。多环境切换建议用 --env-file 显式指定,更可控。
优先级必须心里有数,否则覆盖逻辑会踩坑
当多个地方定义了同一个变量,Docker Compose 按以下顺序决定最终值(从高到低):
- 命令行用
-e KEY=VALUE直接传入(最高) - docker-compose.yml 中
environment字段定义的值 -
--env-file或env_file:加载的文件内容 - 宿主机已有的环境变量(仅在未被上述覆盖时生效)
比如你写了 environment: - DB_HOST=localhost,又在 .env.prod 里写了 DB_HOST=prod-db,最终容器里拿到的仍是 localhost —— 因为 environment 优先级更高。
安全与协作建议
敏感信息如密码、令牌、私钥,一律不要硬编码进 YAML 或 .env 文件(尤其别提交到 Git)。推荐做法:
- 本地开发用
.env.local(加进.gitignore),配合--env-file .env.local - CI/CD 流水线中,通过平台密钥管理功能注入宿主机变量,再由
${TOKEN}引用 - 生产环境考虑结合 Docker Secrets 或外部 Vault 工具,而非仅靠环境变量
不复杂但容易忽略


















