Docker Compose 多環境管理策略 文章首圖

Docker Compose 多環境管理策略

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 檔案。

  1. 開發環境 (.env.dev):適合本地開發,開啟詳細日誌,使用內部網路。
# .env.dev
APP_ENV=development
WEB_PORT=8080
REDIS_PORT=6379
DEBUG=true
  1. 生產環境 (.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: 環境變數優先級如何決定?

當多個來源同時提供環境變數時,優先級順序如下(由高到低):

  1. 容器內硬編寫的環境變數(environment 欄位)。
  2. --env-file 指定的檔案內容。
  3. 當前目錄下的 .env 檔案。
  4. 系統環境變數。

建議在 .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,進一步提升操作效率。