运行时注入环境变量是linux运维中控制容器行为最常用、最安全的方式,核心是配置与镜像解耦;-e适合调试和少量变量,--env-file适合批量管理与环境区分,敏感信息应通过密钥服务动态注入而非明文存储。

运行时注入环境变量是 Linux 运维中控制容器行为最常用、最安全的方式之一,核心在于把配置和镜像解耦。-e 适合调试和少量变量,.env 文件更适合批量管理与环境区分。
用 -e 直接传单个变量
命令简洁、覆盖力强,启动时优先级最高,能直接覆盖 Dockerfile 中同名 ENV 设置。
- 语法:docker run -e KEY=VALUE 镜像名,支持多次叠加,例如:
docker run -e ENV=prod -e PORT=3000 -e TZ=Asia/Shanghai nginx - 典型用途:切换部署环境(dev/test/prod)、指定监听端口、修复时区(Java/Tomcat 容器日志时间错乱常因缺 TZ 导致)
- 注意:不要用 -e 传敏感信息(如 DB_PASSWORD),避免被 ps 或容器 inspect 泄露
用 --env-file 批量加载 .env 文件
把一组变量集中写在本地文件里,结构清晰、便于版本管理(但注意别提交含密钥的 .env 到 Git)。
- 文件格式:每行 KEY=VALUE,空行和 # 开头的注释会被忽略
# .env.prod
DB_HOST=db.example.com
LOG_LEVEL=warn
API_TIMEOUT=5000 - 挂入方式:
docker run --env-file .env.prod nginx - 适用场景:多变量协同(如数据库连接串各字段)、不同环境(.env.staging / .env.prod)快速切换
敏感变量怎么安全处理
.env 文件本身不加密,误提交风险高。生产环境应避免在其中存密码、密钥等。
- 推荐做法:从 .env 中移出敏感项,改由 CI/CD 流水线从密钥服务(如 AWS Secrets Manager、HashiCorp Vault)动态拉取,再通过 -e 注入
- Docker Swarm 或 Compose v3.1+ 可用 secrets 功能,但原生命令 docker run 不支持直接读 secrets,需配合 service create 或 compose 部署
- 临时应急:手动 echo "KEY=$SECRET_VALUE" | docker run --env-file - nginx,用管道传递,避免明文落盘
验证变量是否生效
进容器后别只看 env 命令输出,要确认应用实际读取结果。
- 查看全部环境变量:
docker exec -it env | grep -E "(ENV|TZ|PORT)" - 检查时区是否起作用:
docker exec -it date(应显示本地时间,非 UTC) - 若应用是 Node.js/Python/Java,可在代码里打印 os.environ 或 System.getenv() 确认











