如何向 Docker 容器传递环境变量?

传环境变量给容器:docker run -e KEY=VALUE 逐个传、-e KEY 透传宿主变量、--env-file .env 批量传;compose 用 environment 或 env_file。本文含秘钥管理建议。

最佳实践
如何向 Docker 容器传递环境变量?封面

三种方式:①命令行逐个传 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"'

改了变量要重建容器才生效(环境变量是创建期注入的)。

秘钥管理提醒

  1. .env 加进 .gitignore,永不提交
  2. docker inspect 能看到环境变量——密码类敏感信息优先考虑挂载秘钥文件或编排层的 Secret(K8s Secret / Docker Swarm secret)
  3. 镜像内别用 ENV PASSWORD=... 写死密码,docker history 可见

观测云对照

环境变量差异是"这台正常那台挂"的高发区。 观测云 APM 与日志可携带服务版本、环境标签,不同环境的行为差异按标签分组对比,配置漂移更快暴露。

常见问题(FAQ)

Q:变量值里有空格或特殊字符?
A:命令行用引号包起来 -e "MSG=hello world";env-file 里一般直接写,含特殊字符时谨慎引号。

Q:运行中的容器能改环境变量吗?
A:不能,重建容器生效——这也是配置外置的意义:改配置=换容器,镜像不变。

Q:容器里 cron 任务读不到变量?
A:cron 守护进程不继承主进程环境,详见本系列《如何在 cron 任务中访问 Docker 环境变量》。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台