如何向 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=postgres \
  -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=postgres
DB_PORT=5432
DEBUG=false
docker run -d --env-file .env myapp

方式三:compose

services:
  app:
    environment:
      - DB_HOST=postgres
      - DEBUG=false
    env_file:
      - .env          # 文件里的变量也注入容器

注意:compose 项目根目录的 .env 默认用于 compose 文件本身的变量替换,要注入容器需显式 env_file 声明——两者用途不同。

查看与排错

docker exec myapp printenv DB_HOST DB_PORT   # 仅查看非敏感白名单字段

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

秘钥管理提醒

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

常见问题(FAQ)

Q:变量值里有空格或特殊字符?
A:命令行用引号包起来 -e "MSG=hello world";Docker CLI --env-file按字面值解析,不执行shell变量插值,额外引号可能成为值的一部分;Compose env_file的插值/引号规则不同,environment通常覆盖env_file同名值。

Q:运行中的容器能改环境变量吗?
A:进程可修改自身环境并传给子进程,docker exec -e也可只为新exec进程设置变量;这些都不修改容器创建配置或已运行应用。更新部署环境通常需重建/重启对应应用。

Q:容器里 cron 任务读不到变量?
A:cron可能继承启动环境,但通常会重新构造任务环境,具体取决于实现和配置,详见本系列《如何在 cron 任务中访问 Docker 环境变量》。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台