首页/云/Docker 容器速查/compose environment 字段两种形式
Compose 编排55 条

compose environment 字段两种形式

为服务设置环境变量:列表形式(含仅写键名从宿主透传)与映射形式;它优先于 env_file 中的同名变量。

Docker 容器速查云更新于 2026-10-13

environment 字段干什么

environment 为服务容器注入环境变量,是数据库口令、日志级别、时区这类运行参数的常规入口。它和 env_file 同时存在时,environment 里显式写的键值优先,因此适合放少量需要覆盖或区分的值。

基本信息

两种写法列表 - KEY=value;映射 KEY: value
透传写法列表里只写键名(- TZ)表示从宿主环境取值
优先级environment 高于 env_file,高于镜像里的 ENV
生效时机容器创建时写入,改了要 up 重建容器才生效
转义值里的 $ 必须写成 $$

典型使用场景

  • 给数据库容器传初始化参数:POSTGRES_PASSWORD、POSTGRES_DB 等
  • 同一镜像区分环境:dev 用 LOG_LEVEL=debug,生产用 info,不用改代码
  • 传时区与语言:TZ=Asia/Shanghai,避免日志时间比实际早八小时
  • 由 CI 透传密钥:列表里只写键名,值由流水线注入,不落进仓库文件
  • 关掉框架的交互提示、遥测与自动更新检查
  • 给批处理服务注入批量大小、并发度这类可调参数,不重建镜像就能改行为

示例

示例
services:
  api:
    image: app/api:1.4.2
    environment:
      - LOG_LEVEL=info          # 显式值,优先级最高
      - TZ                      # 从宿主环境透传,需先 export TZ
      - DB_HOST=db
      - DB_PASSWORD: "s3cret"   # 映射写法,值加引号更稳
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: shop
      POSTGRES_PASSWORD: "s3cret"

同名变量取值顺序

来源说明优先级
environmentcompose 文件里显式写死最高
env_file外部文件里的 KEY=value 行中,遇到同名键被 environment 覆盖
镜像 ENVDockerfile 里的 ENV最低,只作默认值
宿主 shell 环境仅当列表里只写键名时才读取取决于是否真的 export 过
YAML 会把纯数字与 no/yes 解析成非字符串,端口号、"no" 这类值一律加引号,否则 Compose 校验时可能报类型错误。
把口令直接写进提交到仓库的 compose 文件等于公开密钥;生产环境用 env_file 指向不入库的文件,或由密钥管理组件注入。
environment 的值只在容器创建时写入,容器重建即失效,所以改完要 up 而不是 restart;只想临时试一个值,可以用 docker run -e 覆盖或改 .env 让 Compose 展开。

易错点

  • 列表里只写键名属于透传:CI 忘记 export 不会报错,容器拿到空值后按默认逻辑启动,行为与预期不符且难查
  • 改完环境变量只 restart 不重建,容器沿用旧的环境,必须 docker compose up -d 让容器重新创建
  • 值里含 $ 未转义会被 Compose 当变量插值展开,口令里带 $ 的启动失败多半是这个原因
  • env_file 的相对路径按项目目录解析,从别的目录执行命令会读不到文件,变量静默变空
  • 多份覆盖文件叠加(-f base.yml -f over.yml)时 environment 按键合并:本文件同名键覆盖基础文件的值,基础文件里其他键仍然保留,最终结果用 docker compose config 展开确认

数据来源与参考

  • Docker 官方文档:Compose environment 参考(docs.docker.com/reference/compose-file/services)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌