docker环境变量配置有四种方式:docker-compose.yml中直接写environment、用env_file引入外部.env文件、命令行用-e或--env-file临时覆盖、dockerfile中用env设默认值;敏感信息严禁硬编码,应通过.gitignore隔离或对接密钥管理服务。

Docker 容器环境变量配置有多种方式,关键看你是用 docker run 单容器启动,还是用 docker compose 编排多服务。不同场景下写法不同,但核心逻辑一致:把键值对注入容器进程的运行时环境。
直接在 docker-compose.yml 中写 environment
这是最常用、最清晰的方式,适合变量不多、需要版本控制或团队共享的场景。
version: '3.8'
services:
web:
image: nginx:alpine
environment:
- NODE_ENV=production
- LOG_LEVEL=warn
- TZ=Asia/Shanghai
也可以用映射语法(更易读):
environment: NODE_ENV: "production" LOG_LEVEL: "warn" TZ: "Asia/Shanghai"
✅ 优点:配置可见、可 Git 管理、无需额外文件
❌ 注意:敏感值(如 API 密钥)不建议直接写在这里
用 env_file 引入外部 .env 文件
适合变量较多、需分环境管理,或要隔离敏感信息的情况。
services:
app:
image: myapp:latest
env_file:
- .env.common
- .env.${ENV_TYPE:-development}
对应 .env.common 内容示例:
# .env.common DB_PORT=5432 REDIS_URL=redis://cache:6379
.env.production 示例:
# .env.production NODE_ENV=production API_URL=https://api.example.com
✅ 优点:集中管理、支持注释、
.env.*可按需忽略提交(如.env.production加入.gitignore)
⚠️ 注意:.env文件里不能有空格(KEY=VALUE,不是KEY = VALUE),注释用#开头
在命令行用 -e 或 --env-file 临时覆盖
适合调试、CI/CD 覆盖、或部署脚本中动态传参:
docker compose up -d \ --env-file .env.production \ -e APP_VERSION=2.1.0 \ -e DEBUG=false
或者单容器启动:
docker run -d \ -e DB_HOST=prod-db \ -e MCP_OPENAI_API_KEY=sk-xxx \ --env-file ./secrets.env \ myapp:latest
✅ 优点:优先级最高,能覆盖所有其他来源的同名变量
⚠️ 注意:命令行里明文写密钥有泄露风险,生产环境慎用
Dockerfile 中用 ENV 设置默认值(构建时固化)
仅用于提供默认值,运行时可被上面任意方式覆盖:
FROM node:18-alpine ENV NODE_ENV=development ENV TZ=UTC WORKDIR /app COPY . . CMD ["npm", "start"]
✅ 优点:镜像自带基础配置,降低启动门槛
❌ 不适合放敏感信息(会留在镜像层,docker history可查)
关于敏感信息的安全提醒
- 永远不要把密码、API Key、JWT Secret 等硬编码进
docker-compose.yml或 Dockerfile - 推荐组合方案:
-
.env.common放通用非密配置(如TZ,LOG_LEVEL) -
.env.local或secrets.env存本地密钥(加进.gitignore) - 生产环境用
--env-file指向由运维管控的密钥文件,或对接 Vault/KMS
-
不复杂但容易忽略











