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