如何向 Docker 容器传递环境变量?
传环境变量给容器:docker run -e KEY=VALUE 逐个传、-e KEY 透传宿主变量、--env-file .env 批量传;compose 用 environment 或 env_file。本文含秘钥管理建议。
三种方式:①命令行逐个传 docker run -e KEY=VALUE(已 export 的变量可只写 -e KEY 透传);②文件批量传 docker run --env-file .env;③compose 里用 environment: 或 env_file: 字段。配置与代码分离是十二要素应用的基本要求,容器化后配置就该走环境变量。
方式一:-e 逐个传
docker run -d --name app \
-e DB_HOST=mysql \
-e DB_PORT=5432 \
-e DEBUG=false \
myapp
# 宿主机已 export 的变量透传(不带值)
export API_TOKEN=abc123
docker run -d -e API_TOKEN myapp
方式二:--env-file 批量传
# .env 文件,每行 KEY=VALUE
DB_HOST=mysql
DB_PORT=5432
DEBUG=false
docker run -d --env-file .env myapp
方式三:compose
services:
app:
environment:
- DB_HOST=mysql
- DEBUG=false
env_file:
- .env # 文件里的变量也注入容器
注意:compose 项目根目录的 .env 默认用于 compose 文件本身的变量替换,要注入容器需显式 env_file 声明——两者用途不同。
查看与排错
docker exec myapp env # 看容器内全部环境变量
docker inspect myapp | grep -A20 '"Env"'
改了变量要重建容器才生效(环境变量是创建期注入的)。
秘钥管理提醒
.env加进.gitignore,永不提交docker inspect能看到环境变量——密码类敏感信息优先考虑挂载秘钥文件或编排层的 Secret(K8s Secret / Docker Swarm secret)- 镜像内别用
ENV PASSWORD=...写死密码,docker history可见
观测云对照
环境变量差异是"这台正常那台挂"的高发区。 观测云 APM 与日志可携带服务版本、环境标签,不同环境的行为差异按标签分组对比,配置漂移更快暴露。
常见问题(FAQ)
Q:变量值里有空格或特殊字符?
A:命令行用引号包起来 -e "MSG=hello world";env-file 里一般直接写,含特殊字符时谨慎引号。
Q:运行中的容器能改环境变量吗?
A:不能,重建容器生效——这也是配置外置的意义:改配置=换容器,镜像不变。
Q:容器里 cron 任务读不到变量?
A:cron 守护进程不继承主进程环境,详见本系列《如何在 cron 任务中访问 Docker 环境变量》。