目錄
前言
1 Docker-compose環境變量基礎
1.1 環境變量的作用與優勢
1.2 環境變量的作用范圍
2 .env文件的核心用法
2.1 .env文件基礎語法
2.2 變量引用與替換
2.3 多環境配置策略
3 高級配置技巧
3.1 環境變量優先級
3.2 條件配置與模板
3.3 安全實踐
4 案例:多環境配置管理
4.1 項目結構設計
4.2 分層配置示例
4.3 Compose文件設計
4.4 部署流程
5 常見問題與解決方案
5.1 變量未生效問題
5.2 敏感信息泄露風險
5.3 多環境切換困難
6 總結
前言
在實際的Docker化應用開發和部署過程中,如何高效管理不同環境的配置差異是一個關鍵挑戰。Docker-compose提供了強大的環境變量支持,允許我們實現配置的動態注入和環境隔離。
1 Docker-compose環境變量基礎
1.1 環境變量的作用與優勢
環境變量是操作系統或容器運行時提供給應用程序的動態配置方式,在Docker-compose中使用環境變量具有以下優勢:
- 配置與代碼分離:避免將敏感信息硬編碼在配置文件中
- 多環境支持:同一份Compose文件可適應不同環境
- 動態注入:運行時決定配置值
- 安全性:敏感信息不暴露在版本控制中

1.2 環境變量的作用范圍
- 在Docker-compose生態中,環境變量可以在多個層面定義和使用:
層級 | 定義方式 | 作用范圍 | 典型用途 |
Shell環境 | export VAR=value | 當前終端會話 | 臨時測試 |
.env文件 | VAR=value | 整個Compose項目 | 項目默認配置 |
compose文件 | environment: | 指定服務 | 服務特定配置 |
env_file | env_file:指定文件 | 指定服務 | 服務專用配置 |
2 .env文件的核心用法
2.1 .env文件基礎語法
- .env文件是Docker-compose默認加載的環境變量定義文件,采用簡單的鍵值對格式:
# 注釋以#開頭
DB_HOST=mysql
DB_PORT=3306
DB_USER=admin
DB_PASSWORD=secret # 包含空格的值需要引號# 支持空行分隔APP_ENV=production
語法規則:
- 每行一個鍵值對,格式為KEY=VALUE
- 值可以不加引號,除非包含空格或特殊字符
- #開頭的行為注釋
- 變量名通常大寫,下劃線分隔
2.2 變量引用與替換
- 在docker-compose.yml中可以通過${VAR_NAME}語法引用.env文件中定義的變量:
services:db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}MYSQL_DATABASE: ${DB_NAME:-defaultdb} # 默認值語法
變量替換語法:
- ${VAR}:基本引用
- ${VAR:-default}:帶默認值的引用
- ${VAR:?error}:必須定義的變量,未定義時報錯

2.3 多環境配置策略
- 實際項目通常需要管理多個環境的配置,推薦的文件結構:
project/
├── .env.dev # 開發環境
├── .env.test # 測試環境
├── .env.prod # 生產環境
├── docker-compose.yml
└── docker-compose.override.yml
加載機制:
- 默認加載.env文件
- 可通過--env-file指定不同文件
- 環境變量可組合使用
3 高級配置技巧
3.1 環境變量優先級
- 當多個地方定義了相同變量時,Docker-compose遵循以下優先級規則:

services:app:image: ${IMAGE_NAME:-myapp}:${TAG:-latest}deploy:replicas: ${REPLICAS:-1}ports:- "${HOST_PORT:-8080}:80"
實際應用場景:
- 敏感信息:使用env_file并加入.gitignore
- 環境差異:使用不同.env文件
- 臨時覆蓋:使用Shell環境變量
3.2 條件配置與模板
- 利用環境變量實現條件化配置:
高級用法:
- 鏡像標簽動態控制
- 資源限制按環境調整
- 功能開關配置
3.3 安全實踐
- 敏感信息管理:
# 生成隨機密碼
openssl rand -base64 16 > .secrets
- git忽略配置:
# .gitignore
.env.local
.secrets
*.env
!.env.example
- 只讀掛載:
services:app:env_file:- ./secrets.env:ro
4 案例:多環境配置管理
4.1 項目結構設計
ecommerce/
├── .env # 基礎配置
├── .env.dev # 開發環境覆蓋
├── .env.staging # 預發布環境
├── .env.prod # 生產環境
├── config/
│ ├── dev/ # 開發環境專用配置
│ ├── prod/ # 生產環境專用配置
│ └── common/ # 通用配置
├── docker-compose.yml
└── docker-compose.prod.yml
4.2 分層配置示例
- 基礎.env:
# 通用配置
APP_NAME=MyApp
LOG_LEVEL=info# 數據庫默認配置
DB_HOST=db
DB_PORT=3306
- 開發環境.env.dev:
# 覆蓋開發環境特定配置
LOG_LEVEL=debug
DB_HOST=localhost
DB_PASSWORD=devpass
- 生產環境.env.prod:
# 生產環境配置
LOG_LEVEL=warn
DB_PASSWORD=${PROD_DB_PASSWORD} # 從CI/CD注入
4.3 Compose文件設計
version: '3.8'services:app:build: .environment:- APP_ENV=${APP_ENV:-development}- DB_HOST=${DB_HOST}- DB_PORT=${DB_PORT}- DB_USER=${DB_USER:-appuser}- DB_PASSWORD=${DB_PASSWORD}env_file:- ./config/${APP_ENV}/secrets.envdb:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}MYSQL_DATABASE: ${DB_NAME}volumes:- db_data:/var/lib/mysqlvolumes:db_data:
4.4 部署流程

- 開發環境啟動:
export APP_ENV=dev && docker-compose up
- 生產環境部署:
export APP_ENV=prod
export PROD_DB_PASSWORD=$(aws secretsmanager get-secret-value ...)
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
5 常見問題與解決方案
5.1 變量未生效問題
癥狀:容器內獲取不到預期的環境變量值排查步驟:
- 使用docker-compose config驗證最終配置
- 檢查變量名拼寫(大小寫敏感)
- 確認.env文件位置正確
- 查看變量優先級是否被覆蓋
5.2 敏感信息泄露風險
防護措施:
- 永遠不要提交包含真實密碼的.env文件到版本控制
- 使用.env.example模板文件記錄變量名
- 考慮使用密鑰管理服務(如AWS Secrets Manager)
- 限制.env文件權限:chmod 600 .env
5.3 多環境切換困難
- 解決方案:
# 環境切換腳本 switch_env.sh #!/bin/bash ENV=$1 cp .env.$ENV .env echo "Switched to $ENV environment" # 使用方式 ./switch_env.sh prod
6 總結
通過本文,我們了解了Docker-compose中環境變量與配置隔離的各個方面。從基礎的.env文件使用到復雜的多環境管理,環境變量機制為我們提供了靈活的應用配置方案。掌握這些環境變量管理技巧后,你的Docker-compose配置將變得更加靈活、安全和可維護,能夠輕松應對從開發到生產各種環境的配置挑戰。