跨容器配置共享需通过统一配置源或服务发现实现:可用env_file注入公共变量、Docker网络+服务名自动DNS解析、根目录.env插值复用宿主机变量,敏感信息应使用Docker Secrets或Vault等安全方案。
环境变量本身不会自动跨容器共享——每个容器拥有独立的进程空间和环境,docker 默认不提供“全局环境变量广播”机制。要实现跨容器的配置共享与传递,需借助外部协调方式,而非直接复制或同步环境变量。核心思路是:让多个容器**读取同一份配置源**,或通过**服务发现+网络通信**间接获取对方状态。
用 env_file 统一注入相同变量
当多个容器需要共用一套配置(如数据库地址、API密钥),最直接的方式是让它们都从同一个 .env 文件加载变量:
- 创建 ./common.env,内容如:
DB_HOST=dbREDIS_URL=redis://cache:6379APP_ENV=production - 在 docker-compose.yml 中为各服务指定该文件:
services:web:env_file: ./common.envworker:env_file: ./common.env - 注意:env_file 中的变量只注入到容器内,不参与 compose 模板插值;若需在端口、镜像名等位置使用变量,应改用项目根目录的 .env(Docker Compose 自动加载)
通过 Docker 网络 + 服务名实现运行时寻址
容器间通信不靠“共享环境变量”,而靠 Docker 内置 DNS:同一自定义网络下的容器可直接用服务名作为主机名访问。
- 定义网络并声明依赖:
networks:app-net:driver: bridgeservices:db:image: postgresnetworks: [app-net]api:image: my-apienvironment:- DB_URL=postgresql://db:5432/mydbnetworks: [app-net] - 此时
api容器中DB_URL的值含服务名db,Docker DNS 会自动解析为对应容器 IP - 无需手动传 IP 或更新环境变量——只要服务名不变,配置就稳定
用 Docker Compose 的 environment 插值复用宿主机变量
若希望不同容器根据宿主机当前环境动态获得不同值(例如开发/生产切换),可结合 根目录 .env 与 environment 字段:
- 项目根目录创建 .env:
DB_HOST=192.168.1.100REDIS_HOST=192.168.1.101 - compose 文件中引用:
environment:- DB_URL=postgresql://${DB_HOST}:5432/app- REDIS_URL=redis://${REDIS_HOST}:6379 - 所有引用该 compose 文件的服务都会拿到一致的解析结果,且可在启动前统一修改根 .env 切换整套配置
敏感信息建议用 Docker Secrets 或外部 Vault
密码、密钥等不应写入 env_file 或 compose 文件明文暴露:
- Docker Swarm 模式下可用
docker secret create创建密钥,再挂载进容器的/run/secrets/xxx路径,应用读取文件而非环境变量 - 非 Swarm 场景推荐集成 HashiCorp Vault、AWS Secrets Manager 等,容器启动后按需拉取解密后的值
- 避免将
-e DB_PASSWORD=xxx直接写在命令行或 YAML 中——历史记录、ps 输出、日志都可能泄露


















