GitLab 本身有提供基本的 Docker Registry 功能,方便使用者存放自己的 Docker image,對於內部的 CI/CD 流程來說,由於採用統一的認證機制,所以相當方便;而 GitLab 在 17.3 的時候也把更方便管理的「container registry metadata database」(之前升級的紀錄)轉換為正是功能,讓使用者不用手動進行資源回收,算是更好用一些。
只是,這項功能就算到現在的 18、在升級的時候好像還是很不穩定?之前在升級次版號的時候,就常常出現需要手動重新進行資料庫升級的操作,算是滿麻煩的。而 Heresy 這邊最近要升級到 18.3.0(官方介紹)、似乎又因為這項功能而導致升級失敗了…
這邊的錯誤訊息是:
Executing command: /opt/gitlab/embedded/bin/registry database migrate up
/var/opt/gitlab/registry/config.yml time="2025-XX-XXTXX:XX:XXZ" level=error msg=Connect
database=registry_database duration_ms=3 err="failed to connect to
`user=registry database=registry_database`: /var/opt/gitlab/postgresql/.s.PGSQL.5432
(/var/opt/gitlab/postgresql/): server error:
FATAL: the database system is starting up (SQLSTATE 57P03)"
host=/var/opt/gitlab/postgresql/ port=5432 failed to construct database connection: verification failed: failed to
connect to `user=registry database=registry_database`:
/var/opt/gitlab/postgresql/.s.PGSQL.5432 (/var/opt/gitlab/postgresql/):
server error: FATAL: the database system is starting up (SQLSTATE 57P03) STDERR: ---- End output of "bash" ---- Ran "bash" returned 1
而在官方論壇也有看到類似的報告:《Database error during upgrade from 18.2.4 to 18.3.0》,而在下面有提供對應的原因和解法。
這邊的回答者認為是因為在升級過程中自動產生的「/var/opt/gitlab/postgresql/data/pg_hba.conf
」這個檔案的內容有問題造成的;這邊需要把檔案內的
local registry registry md5
修改成
local registry registry trust
才行。而他提出的解法,是另外開一個 session、定時覆蓋這個檔案。
不過這邊後來研究一下,其實 pg_hba.conf
這個設定檔的內容應該也是由 gitlab.rb
產生的,所以實際上,只要修改 gitlab.rb
的設定就可以了。
在之前升級資料庫的時候(紀錄),postgresql['custom_pg_hba_entries']
的設定值是:
postgresql['custom_pg_hba_entries'] = { registry_db: [ { type: 'local', database: 'registry_database', user: 'registry', method: 'md5' } ] }
這邊只要把上面 method
的 md5
改成 trust
,然後再重跑一次升級流程就可以了?
不過後來的狀況也滿怪的,雖然第一次升級後是成功運作的,但是不知道為什麼,把電腦重開、讓 GitLab Docker 重啟後,又會出現錯誤而無法完成啟動…但是相關的設定也都還是維持在 trust
的設定,所以變成不太能確定是哪邊的問題了。
之後做了一些測試是發現:
- 如果是重啟 Docker 容器就會出現錯誤
- 例如
docker restart gitlab
就會無法正常開啟 - 但是如果把容器刪除、重新建立就沒問題。
- 如果是用 Docker Compose 的話,就是先執行
docker compose down
,之後再執行docker compose up -d
,這樣看來可以正確啟動。
另外,如果以官方的《Container registry metadata database》這份文件來看,根據裡面的指令有分成「GitLab 17.5 to 18.2」和「GitLab 18.3 and later」來看,應該是認為 GitLab 在內部的實作有修改了。
18.3 的設定要修改的部分基本上簡單很多、很多設定都可以省略掉;所以理論上,應該是要把之前的設定、改成 18.3 以後的設定會比較好。
目前研究了一下,判斷大概是:
-
官方的 registry 資料庫名稱、使用者帳號、密碼都是
registry
、而由於 Heresy 之前的設定有修改,所以這邊要先改回成預設值。這邊修改的指令要在 GitLab Docker 內執行:gitlab-psql -c "ALTER DATABASE registry_database RENAME TO registry" gitlab-psql -c "ALTER USER registry WITH PASSWORD 'registry'"
如果本來就和預設值一樣,就不需要修改。
-
在
gitlab.rb
的部分,如果全部都使用預設值的話,就只需要:registry['database'] = {
'enabled' => false, }本來其他的設定都可以拿掉,像這邊造成問題的
postgresql['custom_pg_hba_entries']
其實也變成可以完全不需要額外設定的狀況。 -
如果 registry 的資料室儲存在本機的話,那
registry['storage']
也不需要修改;如果路徑不是預設值的話,也只需要修改gitlab_rails['registry_path']
就好。
Heresy 這樣修改後,基本上是可以正常使用的。
不過,和前面碰到的問題一樣,重新啟動 Docker 的時候,就會出現資料庫存取的錯誤、而無法完成啟動…但是如果把 Docker 容器刪除重新建立、卻又沒有問題?
由於 Heresy 這次更新的比較晚,再加上又在研究問題和解法,結果在這篇寫完的時候,GitLab 也更新到 18.3.1(官方公告)了。
而目前測試,看起來在 18.3.1 也還是有同樣的狀況。也就是說在重開機、或重啟 Docker 的時候,可能還是會沒辦法正確啟動,而是需要把容器刪除重建。
這點現階段 Heresy 還是不知道該怎麼解?可能就看 GitLab 以後的更新會不會修正了。