Docker Compose 默认自动加载项目根目录下名为 .env 的文件,用于替换 docker-compose.yml 中的 ${KEY} 占位符;该方式轻量通用、不侵入代码与镜像,变量集中定义且一次生效,适用于本地开发与团队协作,但需注意其仅在解析阶段生效,容器内访问需通过 environment 或 env_file 显式透传。
直接在项目根目录放一个 .env 文件,docker compose 就能自动读取并用于替换 docker-compose.yml 里的 ${key} 占位符——这是最轻量、最通用的集中管理方式,不改代码、不碰镜像,本地开发和团队协作都适用。
基础用法:.env 文件自动加载
只要文件名是 .env、且和 docker-compose.yml 在同一目录,Compose 启动时就会默认加载它。格式严格为 KEY=VALUE,等号两边不能有空格,# 开头行为注释:
DB_HOST=localhostNGINX_VERSION=1.25# 这是一行注释
这些变量只在 Compose 解析 YAML 阶段生效,比如用于定义镜像版本:image: nginx:${NGINX_VERSION}。但它们不会自动进入容器,是否透传给容器,取决于你是否在 environment 或 env_file 中显式声明。
安全隔离:敏感变量单独拆出
密码、密钥等绝不能写进主 .env。推荐拆到独立文件,如 .env.secrets,再通过 env_file 引入:
- 在
docker-compose.yml中写:env_file: [".env", ".env.secrets"] - 立即执行:
chmod 600 .env.secrets,防止其他用户读取 - 把
.env.secrets加入.gitignore;同时提交.env.secrets.example供新成员参考
多环境适配:按需组合不同 .env 文件
靠 env_file 列表顺序实现配置分层,后加载的同名变量会覆盖前面的。例如:
-
.env.base:通用项(如服务名、端口前缀) -
.env.development:调试开关、本地地址 -
.env.production:生产数据库地址、密钥
开发环境 yml 片段:env_file: ["./.env.base", "./.env.development"]
生产环境 yml 片段:env_file: ["./.env.base", "./.env.production"]
与 environment 字段协同使用
env_file 负责批量加载变量,environment 决定哪些变量真正进容器:
- 只加载不透传:
env_file里的NGINX_VERSION可用于image: nginx:${NGINX_VERSION},但容器内访问不到 - 选择性透传:在
environment中写- DB_PASSWORD=${DB_PASSWORD},该变量才会注入容器 - 避免硬编码:
environment中不要写- DB_PASSWORD=123456,始终用${}引用


















