在使用 Docker Compose 管理 PostgreSQL 容器時,環境變數的設定對容器的初始運行和再啟動方式有重要影響。特別是,根據數據卷的存在與否,各變數的應用時機有所不同,因此必須準確理解這一點以便安全運行。
1. 必需環境變數: POSTGRES_PASSWORD
當用 Docker 映像運行 PostgreSQL 容器時,POSTGRES_PASSWORD 是與數據卷的狀態無關的必須設置的唯一必需環境變數。
| 變數名 | 角色 | 應用時機 | 刪除時行為 |
|---|---|---|---|
POSTGRES_PASSWORD |
設置超級用戶密碼 | 始終需要 (初始設置及容器啟動過程) | 容器啟動失敗 (安全錯誤) |
核心: 此變數是啟動容器的安全要求,即使數據已存在,也必須在 docker-compose.yml 文件中明確指定。
2. 初始設置變數: 應用時機理解
POSTGRES_USER 和 POSTGRES_DB 是僅在數據庫集群首次創建時(數據卷為空時)應用的環境變數。
| 變數名 | 角色 | 應用時機 | 重啟時更改的影響 |
|---|---|---|---|
POSTGRES_USER |
指定初始超級用戶名稱 | 僅在卷為空時 | 被忽略 (保持現有用戶) |
POSTGRES_DB |
創建初始數據庫名稱 | 僅在卷為空時 | 被忽略 (保持現有數據庫) |
📌 重啟時的行為原理
在以 docker-compose up -d 重新啟動容器時,如果連接到已存在數據的卷,PostgreSQL 映像將跳過初始化過程(initdb),並加載現有數據。
因此,當您更改容器名稱、日誌設置等其他設置後,重啟時,即使修改 POSTGRES_USER 或 POSTGRES_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)應絕對避免使用。
目前沒有評論。