與Docker中任何DB一起運行Sonarqube的完整指南。
用構圖策劃的碼頭聲音很容易,但是實踐中有一些陷阱。請繼續閱讀以了解整個故事,或者如果您只想運行它,請直接跳到入門。
首次通過組合一起運行聲納克和數據庫容器時,您可能會遇到這樣的錯誤:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').這是因為數據庫初始化過程比Sonarqube的引導時間更長,尤其是在沒有持久數據庫的情況下。
那麼,如何檢測數據庫連接的準備狀態?
失敗了:
depends_on選項:您可以在docker-compose.yml文件中指定此選項以按依賴性順序啟動服務,但是它不會等待依賴服務準備就緒。
等待腳本:可以使用Docker控制啟動訂單中推薦的等待腳本,可用於檢查數據庫端口的可用性並等待。不幸的是,這也無濟於事。原因是該端口將在數據庫容器啟動之後立即可用,但這並不意味著數據庫連接已準備就緒。只需忘記nc -v -n -z -w1 $HOST $PORT即可。
HEALTHCHECK指令:此新功能自1.12版以來可用於Dockerfiles,但尚未用於Docker-Compose(現在它已經存在)。用法: HEALTHCHECK [OPTIONS] CMD command 。這聽起來很有希望,但是您仍然必須自己編寫命令,才能告訴Docker檢查什麼。
數據庫命令:運行mysql -e "select 1"如何檢查數據庫可用性?是的 - 但是請等一下 - Sonarqube容器沒有安裝MySQL客戶端,我們無法控制Sonarqube Docker官方的映像。
Web服務器:另一個黑客 - 如果我們在MySQL容器中設置了最小(單線)Web服務器,該服務器對數據庫狀態響應?像while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done 。不幸的是,NetCat通常不是數據庫圖像的一部分。
數據庫日誌:MySQL將其準備狀態寫入日誌,因此也許我們可以嘗試使用grep 'ready for connections' 。通常,這些日誌僅在MySQL容器中或主機計算機中可訪問,而不是從Sonarqube容器中訪問。也許我們可以嘗試通過添加command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" volumes: ./data/mysql:/var/log/mysql /var/mysql/mmysql/mmsql/mmsql/mmsql/mmsql/mmysql/mmysql./mmysql./mysql./mysql。然後,我們可以安裝音量與Sonarqube容器共享,以便在那裡提供。但是,我們真的想弄亂兩種服務方面的command和volumes配置嗎?
必須有更好的方法……
什麼有效:
從Sonarqube v7.9開始,它將不再支持MySQL。有關更多信息,請訪問MySQL支持的生命終結。結果,對於下面提到mySQL的任何段落,請忽略。除非您仍然想將MySQL與Sonarqube V7.7(或更早版本)一起使用。
確保已將整個項目(尤其是detector.java )克隆,以檢查數據庫的準備。
將Sonarqube和數據庫(例如MySQL或PostgreSQL )的Docker圖像繪製所需的版本:
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]首先:在不檢查Sonarqube要求的情況下直接使用最新版本的數據庫(最新Sonarqube版本的先決條件,或以前版本的文檔),這不是一個好主意。例如,Sonarqube 6.3僅支持MySQL 5.6和5.7。而且,如果您用MySQL 8.0旋轉Sonarqube 6.3,將會拋出一個例外:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (可選 - 僅MySQL和MacOS)使用boot2docker將主機目錄安裝在MySQL容器中時存在權限問題。
[ERROR] InnoDB: Operating system error number 13 in a file operation.
[ERROR] InnoDB: The error means mysqld does not have the access rights to the directory.解決方案:
為MacOS構建自定義MySQL圖像(別忘了更改mysql_mac/Dockerfile中的latest標籤):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/編輯docker-compose-mysql.yml ,替換image: mysql by image: mysql_mac 。
為了持久數據,您需要設置安裝數據量:在Docker-Compose- <db> .yml文件中替換兩個在卷下的安裝點。
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
注意:在主機上持久數據的路徑可能是相對路徑,例如: ./data/xyz xyz
不要使用默認的空標籤或動態latest標籤,而是在Dockerfile或docker-compose文件中使用更具體的標籤更改它們。因為latest可能會導致不可預測和不可重複的圖像構建。
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up Sonarqube的插件。
/opt/sonarqube/extensions所有歷史分析數據,導入規則,更改設置都保存在數據庫中。
/var/lib/mysql
# or
/var/lib/postgresql不要堅持使用Elasticsearch索引(位於/opt/sonarqube/data/es ),讓其單獨重建,否則在升級過程中可能會引起問題。任何令人難以置信的關閉(例如Sonarqube崩潰)都可能導致異步指數。
如果需要升級失敗並且需要向後回滾,請始終保持備份數據庫。
在MySQL的舊版本上執行邏輯備份
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sql啟動一個MySQL Docker容器(MySQL的新版本)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bash啟動MySQL Server
/etc/init.d/mysql start啟動MySQL客戶端
mysql創建並使用數據庫
create database sonar ;
use sonar;授予用戶特權
grant all on sonar. * to ' sonar ' @ ' % ' identified by ' sonar ' ;
grant all on sonar. * to ' sonar ' @ ' localhost ' identified by ' sonar ' ;
grant usage on * . * to sonar@localhost identified by ' sonar ' ;
grant all privileges on sonar. * to sonar@localhost;還原備份文件(通過執行SQL腳本)
source / tmp / sonar . sql退出MySQL客戶端
exit停止MySQL Server
/etc/init.d/mysql stop現在,您已經成功地在新版本的MySQL上恢復了數據庫。數據庫數據存儲在主機的path_to_persist_db中。
Sonarqube服務器升級過程是自動化的,Sonarqube數據庫中無需手動更改。
遷移路徑: [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
Sonarqube的升級指南(僅供參考,請按照以下步驟進行。)
不要試圖停止Sonarqube服務器,如果您殺死該過程,Sonarqube容器會立即退出。因此,您無法真正在其容器中手動升級Sonarqube。不用擔心,只需嘗試以下步驟即可。
步驟:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ;對於Big Sonarqube升級,它也需要數據庫升級,但這會自動發生。
新的Sonarqube容器啟動後,打開其網頁,您將被重定向到維護頁面;
sonarqube_1 | 2099.12.31 12:00:00 WARN web[o.s.s.p.DatabaseServerCompatibility] Database must be upgraded. Please backup database and browse /setup
sonarqube_1 | 2099.12.31 12:00:00 INFO web[o.s.s.p.Platform] DB needs migration, entering safe mode打開http:// [your_sonarqube_url]:9000/setup ;
單擊升級按鈕。
數據庫升級可能需要幾分鐘。當DB遷移成功結束時,該頁面將顯示“數據庫是最新的”,然後將您重定向到主頁。
版權(c)2016-2019 Jing li。 Sonarondocker根據GNU Livese General Public Licens發行,版本3.0。有關詳細信息,請參見許可證文件。