变量优先级 1/6

从低到高,后者覆盖前者:

▲ 覆盖
.env 文件(项目根目录)
自动加载,用于 ${VAR} 插值,优先级最低
▲ 覆盖
env_file 指定的文件
注入到容器环境变量,覆盖 .env 中的同名变量
▲ 覆盖
environment 块
直接在 Compose 文件中定义,覆盖 env_file
▲ 覆盖
docker compose run -e / shell 环境
命令行传入,优先级最高

交互式示例

场景:.env 设 A=1,environment 设 A=2
容器内 A=2(environment 覆盖 .env)
场景:.env 设 A=1,environment 设 A=${A_FROM_SHELL},shell 中 A_FROM_SHELL=3
容器内 A=3(shell 环境变量优先)
# .env 文件
DB_HOST=localhost
DB_PORT=5432

# docker-compose.yml
services:
  app:
    environment:
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT:-5432}  # 默认值语法
    env_file:
      - .env.local

extends / 多环境配置 2/6

用 extends 继承公共配置,用多 Compose 文件覆盖差异。

# docker-compose.yml(基础配置)
services:
  web:
    image: myapp:latest
    ports:
      - "3000:3000"

# docker-compose.override.yml(开发环境自动加载)
services:
  web:
    volumes:
      - .:/app
    environment:
      - DEBUG=true

# docker-compose.prod.yml(生产环境手动指定)
services:
  web:
    environment:
      - DEBUG=false
    restart: always
# 开发环境(自动合并 override)
docker compose up

# 生产环境(显式指定)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

healthcheck 健康检查 3/6

services:
  web:
    image: nginx:alpine
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s

  db:
    image: mysql:8.0
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
💡 依赖服务的启动顺序:配合 depends_on.condition: service_healthy 确保数据库就绪后再启动应用。
services:
  app:
    depends_on:
      db:
        condition: service_healthy
        restart: true

deploy 资源配置 Swarm 专属 4/6

services:
  web:
    image: nginx:alpine
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
        failure_action: rollback
      rollback_config:
        parallelism: 0
      resources:
        limits:
          cpus: "0.5"
          memory: 256M
        reservations:
          cpus: "0.25"
          memory: 128M
      restart_policy:
        condition: on-failure
        max_attempts: 3
⚠️ deploy 配置仅在 Swarm 模式下生效。docker compose up 会忽略 deploy 块,需用 docker stack deploy 部署。

configs / secrets Swarm 专属 5/6

services:
  app:
    image: myapp:latest
    secrets:
      - db_password
    configs:
      - nginx_config
    environment:
      DB_PASSWORD_FILE: /run/secrets/db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt
    # 或 external: true(从 Docker 已有 secret 读取)

configs:
  nginx_config:
    file: ./configs/nginx.conf
💡 secrets 挂载到 /run/secrets/<name>,文件权限 0444(只读)。configs 挂载到 /<name>。两者都不写入镜像层。

多 Compose 文件合并 6/6

多个 Compose 文件按顺序合并,后者覆盖前者的同名配置。

合并策略说明
标量值后者覆盖前者(如 image、command)
列表/数组合并(如 ports、volumes、environment)
映射/对象深度合并(如 environment 的键值对)
# 常见多环境文件结构
docker-compose.yml           # 基础配置
docker-compose.override.yml  # 开发覆盖(自动加载)
docker-compose.prod.yml      # 生产覆盖
docker-compose.test.yml      # 测试覆盖

# 使用方式
docker compose up                                    # 开发
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d  # 生产
docker compose -f docker-compose.yml -f docker-compose.test.yml up --abort-on-container-exit  # 测试