Docker Compose自动读取同目录下的.env文件,Docker CLI需用--env-file显式指定;.env须命名正确、格式严格(KEY=VALUE、无空格、支持#注释),不支持变量展开;敏感信息应通过--env-file传递并加入.gitignore,生产环境推荐CI/CD注入。

直接在项目根目录放一个 .env 文件,Docker Compose 会自动读取它;Docker CLI 则需用 --env-file 显式指定。关键不是“怎么放”,而是“谁读、怎么用、怎么保护”。
.env 文件怎么写才有效
文件名必须是 .env(不能叫 config.env 或 .env.local),放在 docker-compose.yml 所在目录 下才会被自动加载。内容格式严格:每行一个 KEY=VALUE,等号前后不能有空格,支持 # 开头的注释和空行:
DB_HOST=db-prod.internalAPP_PORT=8080# 这是注释,会被忽略API_TIMEOUT=5000
注意:不支持变量展开(比如不能写 HOME_DIR=$HOME),也不校验路径是否存在——写错就静默失效。
Docker Compose 自动加载 .env
只要 .env 和 docker-compose.yml 在同一目录,启动时无需额外参数,Compose 就会把文件里的变量注入到整个编排上下文中:
- 在
docker-compose.yml中用${VAR_NAME}引用,比如MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} - 变量可被 service 的
environment、image标签甚至端口映射引用 - 若变量未定义,Compose 默认留空;可用
${VAR_NAME:-default}提供默认值
Docker CLI 必须显式传入 --env-file
docker run 不会自动找 .env 文件,必须加 --env-file 参数:
docker run --env-file .env -p 8080:80 my-app- 路径支持相对路径(如
.env)或绝对路径(如/path/to/.env) - 可叠加多个
--env-file,后加载的覆盖先加载的同名变量 - 敏感信息(密码、密钥)务必用这个方式,避免出现在命令历史或进程列表里
安全与协作建议
.env 文件本身不加密,管理重点在权限和流程:
- 把
.env加进.gitignore,只提交.env.example作为模板 - 生产环境用 CI/CD 流水线注入变量,而不是拷贝本地 .env
- 多环境区分靠不同文件:开发用
.env.dev,生产用.env.prod,启动时用docker-compose --env-file .env.prod up - 绝不在 Dockerfile 的 ENV 指令里写敏感值,构建阶段无法动态替换


















