# 环境变量与配置管理

URL: https://caijiao.org/docker/compose/env-and-config
Source: docs/docker/compose/env-and-config.md
Description: 本章节介绍 Docker Compose 中环境变量和配置文件的使用方法，包括 .env 文件、环境变量引用、配置卷和动态参数，帮助开发者实现灵活可维护的多容器应用配置管理。

在 Docker Compose 中，合理管理环境变量和配置文件可以提高多容器应用的可移植性和可维护性。

## 1. 使用环境变量

- 可以在 `docker-compose.yml` 文件中直接定义：

```yaml
services:
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
````

- 使用 `.env` 文件集中管理：

```txt
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=mydb
```

```yaml
services:
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
```

- 优点：

  - 配置集中管理
  - 支持不同环境快速切换（开发/测试/生产）

## 2. 配置文件（Config / Secret）

- Compose v3.3+ 支持 Config 和 Secret 管理：

```yaml
services:
  app:
    image: myapp
    configs:
      - source: app_config
        target: /etc/myapp/config.yml

configs:
  app_config:
    file: ./config/config.yml
```

- Secret 管理敏感信息：

```yaml
services:
  db:
    image: mysql:8
    secrets:
      - db_root_password

secrets:
  db_root_password:
    file: ./secrets/root_password.txt
```

## 3. 使用环境变量的高级技巧

- 默认值：

```yaml
environment:
  MYSQL_USER: ${MYSQL_USER:-defaultuser}
```

- 复合变量：

```yaml
environment:
  DATABASE_URL: "mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@db:3306/${MYSQL_DATABASE}"
```

- 在命令中使用：

```yaml
command: sh -c "echo $DATABASE_URL"
```

## 4. 配置挂载卷

- 将宿主机配置文件挂载到容器：

```yaml
services:
  app:
    volumes:
      - ./config/app.yml:/app/config.yml:ro
```

- 可实现容器间共享和灵活更新

## 5. 最佳实践

- 对敏感信息使用 Secret，避免直接写入 Compose 文件
- 使用 `.env` 文件统一管理变量，支持不同环境
- 配置文件尽量挂载为只读（`ro`）防止容器意外修改
- 使用环境变量生成动态配置，提高可移植性

---

通过环境变量和配置管理，Docker Compose 应用可以灵活适应不同环境，保证配置安全和易维护性。
