直接用 -e 或 --env-file 就能动态注入环境变量,无需修改镜像或重新构建;-e 适合调试和少量非敏感参数,--env-file 更安全,适用于生产环境批量注入敏感信息,且支持注释与空行。

直接用 -e 或 --env-file 就能动态注入,不需要改镜像或重启构建。关键在运行时传参,不是写死在 Dockerfile 里。
单个变量用 -e 最快
适合调试、CI/CD 临时覆盖或少量非敏感参数:
docker run -e DB_HOST=10.0.1.5 -e LOG_LEVEL=debug nginx- 可多次叠加
-e,顺序无关 - 会覆盖 Dockerfile 中同名
ENV设置(比如ENV DB_HOST=localhost) - 注意大小写:
DB_USER和db_user是两个变量,多数应用只认大写命名
批量变量用 --env-file 更安全
适合生产环境、含密码/API密钥等敏感信息,避免命令行泄露:
- 先准备一个本地
.env文件(不提交 Git):
DB_USER=admin
DB_PASSWORD=7xK!q9#mL2
API_TIMEOUT=5000
- 启动时加载:
docker run --env-file ./.env -p 8080:8080 myapp - 支持
#注释和空行,Docker 自动跳过 - 文件路径必须是相对或绝对路径,不能是 URL
组合使用实现分层覆盖
实际部署中常混合使用,优先级从高到低:命令行 -e > --env-file > Dockerfile ENV:
- 例如 Dockerfile 有
ENV APP_ENV=dev - 运行时加
--env-file prod.env(里面含APP_ENV=prod)→ 容器取prod - 再额外加
-e APP_ENV=staging→ 最终容器里就是staging - 这种链式覆盖让同一镜像可在开发、测试、生产环境无缝切换
变量要被应用真正读到才生效
环境变量只是“传进去”,应用代码必须主动读取才能起作用:
- Node.js 用
process.env.DB_HOST - Python 用
os.environ.get("DB_HOST") - Java Spring Boot 默认读
DB_HOST对应的spring.datasource.host需额外配置 - 如果应用没写读取逻辑,变量传了也白传











