容器创建时通过环境变量动态注入配置参数,本质是让应用在启动前就拿到可变的运行时设置,而不是把数据库地址、密钥、日志级别这些写死在镜像里;关键在于“运行时注入”和“应用主动读取”两个环节配合好。

容器创建时通过环境变量动态注入配置参数,本质是让应用在启动前就拿到可变的运行时设置,而不是把数据库地址、密钥、日志级别这些写死在镜像里。关键在于“运行时注入”和“应用主动读取”两个环节配合好。
直接用 -e 传单个变量
适合调试或覆盖少量参数,命令行最直观:
- docker run -e DB_HOST=192.168.10.5 -e LOG_LEVEL=warn nginx —— 启动即生效,会覆盖 Dockerfile 中同名 ENV 值
- 多个 -e 可叠加,顺序无关;大小写敏感,DB_HOST 和 db_host 是不同变量
- 不建议传密码等敏感信息,命令历史和 ps 都可能泄露
用 --env-file 批量加载
生产环境推荐方式,把变量集中管理、避免命令行暴露:
- 先准备一个 .env 文件(不提交 Git),内容如:
DB_USER=prod_admin
DB_PASSWORD=Kx9#mQ2t
API_TIMEOUT=3000 - 启动时用 docker run --env-file .env nginx
- 支持 # 注释和空行,文件权限设为 600 更安全
在 docker-compose.yml 中统一管理
多容器协作时更清晰,支持变量继承与覆盖:
- 用 environment 字段写死值:
environment:
- NODE_ENV=production
- TZ=Asia/Shanghai - 用 env_file 引入外部文件:
env_file:
- ./prod.env - 两者可共存,environment 优先级高于 env_file,适合做环境特有覆盖
应用端必须正确读取才真正生效
环境变量注入只是“送到了门口”,应用得自己开门拿:
- Node.js 用 process.env.DB_HOST
- Python 用 os.environ.get('DB_HOST', 'localhost')(别直接用 [],防 KeyError)
- PHP 用 getenv('DB_HOST') 或 $_ENV['DB_HOST']
- Java Spring Boot 默认识别 spring.datasource.url 这类命名变量
不复杂但容易忽略











