Docker Compose 多環境管理策略
在 Docker 開發與部署的實務中,我們經常面臨一個經典難題:如何讓同一套服務代碼,在不同的環境(如開發、測試、生產)中正確運行?硬編寫配置檔不僅維護困難,更容易因環境差異導致「在我電腦上跑得動」的窘境。Docker Compose 提供了強大的環境變數與配置文件分離機制,能讓我們以優雅的方式解決這個問題。本文将介紹如何利用環境檔案(Environment Files)與覆蓋檔(Override Files)來實現多環境管理。
核心概念:環境變數與配置文件分離
Docker Compose 的核心優勢在於其支援從外部注入環境變數。預設情況下,Compose 會自動載入當前目錄下的 .env 檔案。透過建立不同名稱的環境檔,我們可以輕鬆切換配置,而無需修改 docker-compose.yml 本身的邏輯。
步驟一:建立基礎專案結構
首先,讓我們建立一個標準的專案目錄結構。假設我們正在建置一個 Web 應用,包含 Nginx 和 Redis 服務。
mkdir multi-env-demo
cd multi-env-demo
接著,建立基礎的 docker-compose.yml。這裡我們使用環境變數來定義服務參數,例如 Redis 的連線資訊或應用程式的 Port。
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "${WEB_PORT:-8080}:80"
volumes:
- ./html:/usr/share/nginx/html
environment:
- APP_ENV=${APP_ENV}
- REDIS_HOST=${REDIS_HOST}
depends_on:
- redis
redis:
image: redis:7-alpine
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
volumes:
redis_data:
注意上述 YAML 中的 ${VARIABLE:-DEFAULT} 語法,這表示如果環境變數未設定,則使用預設值。這讓我們的配置文件更具彈性。
步驟二:建立多環境配置檔
現在,我們為不同環境建立對應的 .env 檔案。
- 開發環境 (
.env.dev):適合本地開發,開啟詳細日誌,使用內部網路。
# .env.dev
APP_ENV=development
WEB_PORT=8080
REDIS_PORT=6379
DEBUG=true
- 生產環境 (
.env.prod):適合上線部署,關閉除錯,使用標準 Port。
# .env.prod
APP_ENV=production
WEB_PORT=80
REDIS_PORT=6379
DEBUG=false
步驟三:使用 -f 參數與 --env-file 啟動服務
Docker Compose 允許我們指定特定的配置文件。雖然 Compose 預設只讀取 .env,但我們可以透過 shell 腳本或 alias 來簡化操作。
方法 A:直接指定環境檔(推薦)
在 Linux shell 中,你可以使用 env 命令來臨時載入環境變數:
# 啟動開發環境
env $(cat .env.dev | xargs) docker-compose up -d
# 啟動生產環境
env $(cat .env.prod | xargs) docker-compose up -d
方法 B:使用覆蓋檔(Override Files)
對於更複雜的設定差異(例如增加額外的 Volume 或修改資源限制),使用 YAML 覆蓋檔是更好的選擇。
建立 docker-compose.dev.yml:
version: '3.8'
services:
web:
environment:
- DEBUG=true
volumes:
- ./dev-config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
啟動時合併配置文件:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
常見問題與解決方案
Q1: 環境變數優先級如何決定?
當多個來源同時提供環境變數時,優先級順序如下(由高到低):
- 容器內硬編寫的環境變數(
environment欄位)。 --env-file指定的檔案內容。- 當前目錄下的
.env檔案。 - 系統環境變數。
建議在 .env 中僅存放預設值,並在 CI/CD 或手動部署時透過 --env-file 覆蓋,以避免意外修改基礎配置。
Q2: 如何避免敏感資訊洩漏?
切勿將包含密碼、API Key 的 .env 檔案提交至 Git 倉庫。請在 .gitignore 中加入:
.env
*.env
並建立一個 .env.example 檔案,僅提供變數名稱範例,供團隊成員參考:
APP_ENV=
REDIS_HOST=
REDIS_PASSWORD=
小結
透過結合環境變數檔與 Compose 的配置文件覆蓋機制,我們可以建立一套靈活的 Docker 管理策略。這種方法不僅消除了環境差異帶來的困擾,更讓專案結構保持清晰。對於中階 Linux 使用者而言,掌握 -f 參數與 .env 的互動機制,是邁向容器化編排的重要一步。建議在實際專案中,將啟動指令封裝成 Makefile 或 Shell Script,進一步提升操作效率。