本文章生命週期剩餘 208 天,結束後可能出現圖片丟失及檔案連結錯誤。
自架服務使用 Docker-Compose 很正常,一直一來都是半路出家的使用,都沒什麼問題,直到整合 blinko、linkwarden 及 ollama 之後,才發現原來之前的使用方式有點問題。
這陣子每次只要更新 blinko 就很容易出現資料庫連線錯誤的訊息,看了 log 並且詢問 AI 之後總算是弄懂為什麼及怎麼避免。我把全部的服務都放在同一個內網,名稱是ollama-network,想要將有支援 AI 的統統以http:ollama:11434連結執行,這個想法沒有錯也很好,但是因為我的資料庫是以服務來區分,意思就是blinko裡面有個POSTGRES名稱的資料庫,而linkwarden裡面也有個相同名稱的資料庫,這要是放在不同網路下是沒有問題的,但是放在一起之後很容易一更新就會連到錯誤的資料庫,造成連接出錯。而修正方式就是把Docker-Compose的名稱更改就好,以下就是資料庫名稱的修正說明
1. Docker 內資料庫連線說明
當你在 .env 或 docker-compose.yml 中看到這樣的連線字串:
DATABASE_URL=postgresql://blinko:Ui4VTuXgi0@blinko-postgres:5432/blinko
這是一種標準的 PostgreSQL 連線 URL 格式,用來讓應用程式知道要怎麼連接資料庫。
1.1. 格式結構說明
postgresql://<使用者名稱>:<密碼>@<主機名稱>:<埠號>/<資料庫名稱>
1.2. 詳解這一行
postgresql://blinko:Ui4VTuXgi0@blinko-postgres:5432/blinko
| 區塊 | 說明 |
|---|---|
postgresql:// |
這是協定(protocol),表示使用 PostgreSQL 資料庫。 |
blinko |
資料庫使用者帳號,對應 POSTGRES_USER=blinko。 |
Ui4VTuXgi0 |
使用者密碼,對應 POSTGRES_PASSWORD=Ui4VTuXgi0。(實務中應避免硬編碼,改用 .env 變數較安全) |
blinko-postgres |
資料庫主機位址,這裡是 Docker Compose 內部的服務名稱,不是 IP。其他容器會透過這個名稱連線。 |
5432 |
資料庫的 port,PostgreSQL 預設就是 5432。 |
/blinko |
資料庫名稱,對應 POSTGRES_DB=blinko。 |
1.3. 實務補充
-
容器之間使用服務名稱當作 DNS 名稱是 Docker 的特性。
- 所以
@blinko-postgres不需要換成 IP,只要確定在同一 network 中就會通。
- 所以
-
若用在本機測試(非 Docker),你可能需要改成:
postgresql://blinko:Ui4VTuXgi0@localhost:5432/blinko
1.4. Docker-Compose 範例內容
#服務名稱就是連線的名稱,各個服務更換不同名稱即可定義為不同的資料庫
blinko-postgres:
image: postgres:14
#容器的名稱可以自行設定,不設定的話也沒關係,docker 會隨機定義,如 blinko-postgres-app 這樣
container_name: blinko-postgres
restart: always
environment:
POSTGRES_DB: blinko
POSTGRES_USER: blinko
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
TZ: Asia/Taipei