在使用 Docker Compose 管理 PostgreSQL 容器時,環境變數的設定對容器的初始運行和再啟動方式有重要影響。特別是,根據數據卷的存在與否,各變數的應用時機有所不同,因此必須準確理解這一點以便安全運行。


1. 必需環境變數: POSTGRES_PASSWORD



當用 Docker 映像運行 PostgreSQL 容器時,POSTGRES_PASSWORD 是與數據卷的狀態無關的必須設置的唯一必需環境變數。

變數名 角色 應用時機 刪除時行為
POSTGRES_PASSWORD 設置超級用戶密碼 始終需要 (初始設置及容器啟動過程) 容器啟動失敗 (安全錯誤)

核心: 此變數是啟動容器的安全要求,即使數據已存在,也必須在 docker-compose.yml 文件中明確指定。


2. 初始設置變數: 應用時機理解

POSTGRES_USERPOSTGRES_DB 是僅在數據庫集群首次創建時(數據卷為空時)應用的環境變數。

變數名 角色 應用時機 重啟時更改的影響
POSTGRES_USER 指定初始超級用戶名稱 僅在卷為空時 被忽略 (保持現有用戶)
POSTGRES_DB 創建初始數據庫名稱 僅在卷為空時 被忽略 (保持現有數據庫)

📌 重啟時的行為原理

在以 docker-compose up -d 重新啟動容器時,如果連接到已存在數據的卷,PostgreSQL 映像將跳過初始化過程(initdb),並加載現有數據。

因此,當您更改容器名稱、日誌設置等其他設置後,重啟時,即使修改 POSTGRES_USERPOSTGRES_DB 的值,現有數據庫的用戶或名稱不會改變。


3. Docker Compose 示例



以下是包含必需變數和建議變數的簡潔 docker-compose.yml 示例。

services:
  db:
    image: postgres:latest
    restart: always
    container_name: my_postgres_db  # 容器名稱 (可更改)
    logging:
      driver: "json-file"          # 日誌方式 (可更改)
    environment:
      # ⚠️ 必需變數: 必須包含。
      POSTGRES_PASSWORD: your_secure_password 

      # 初始設置變數: 僅在卷為空時應用。
      POSTGRES_USER: devuser
      POSTGRES_DB: main_app_db
    ports:
      - "5432:5432"
    volumes:
      # 用於永久存儲數據的卷
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

✨ 運行提示: 安全的設置變更

更改容器名稱、日誌設置等後,若要在保留現有數據的情況下重新啟動,請使用以下命令。

docker-compose up -d

注意: 刪除數據的卷的命令(docker-compose down -v)應絕對避免使用