一、背景
為了保證外包項目的質量,我們需要搭建一個代碼掃描的工具,減少人工review的工作量。
依舊是內網環境,只能通過外網docker鏡像的方式把整個環境遷移到內網服務器上。
二、嘗試方法(此處方法不可行)
由於新版的sonar不再支持mysql,所以我們需要使用postgresql作為替代。
因此需要使用如下兩個鏡像:
docker run -d --name pgdb -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -v /data/pgdata:/var/lib/postgresql/data-d docker.io/postgres:latest
docker run --name sq --link pgdb -e SONARQUBE_JDBC_URL=jdbc:postgresql://pgdb:5432/sonar \
-p 9000:9000 \
-v /data/sonarqube/data:/opt/sonarqube/data \
-v /data/sonarqube/extensions:/opt/sonarqube/extensions -d sonarqube
但是在啟動sonarqube時失敗了,容器自動退出。
三、問題排查
經過網上搜索,發現有兩個地方比較可疑:
1、宿主機的最大用戶可用內存小於鏡像需求:原因是sonar 使用了elastic search服務,后者要求可用內存上限是:262144
具體內容可見官方docker上維護sonar鏡像說明 截圖如下所示:
為了使設定永久生效,我們通過如下命令,參考了
https://www.cnblogs.com/lyrb/p/11951018.html
報錯信息如下 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 臨時解決辦法(重啟虛擬機會失效): 1.切換到root用戶,執行命令: sysctl -w vm.max_map_count=262144 2.查看結果: sysctl -a|grep vm.max_map_count 3.顯示: vm.max_map_count = 262144 永久解決辦法 在/etc/sysctl.conf文件最后添加一行:vm.max_map_count=262144 重啟虛擬機
2、查看容器啟動后的日志,定位具體問題所在
發現log中提示是數據庫連不上,因此需要解決數據庫的問題:
2020-06-19T03:04:48.030007092Z Caused by: java.lang.IllegalStateException: Can not connect to database.
Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').
檢查之后,發現應該是啟動sonar時沒有指定用戶名和密碼,因此,重新運行容器,采用另外的命令,
最終解決方案如下:
docker run \ -d \ --name postgres10 \ -p 5432:5432 \
-v /home/s/postgres/data:/var/lib/postgresql/data-d -e POSTGRES_USER=sonar \ -e POSTGRES_PASSWORD=123456 \ #這里的用戶和密碼如果不指定的話,用戶默認是postgres, 密碼需要我們指定。 postgres:10
docker run \ -d \ --name sonarqube7.9 \ -p 9000:9000 \ --link postgres10 \ -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgres10:5432/sonar \ -e SONARQUBE_JDBC_USERNAME=sonar \ -e SONARQUBE_JDBC_PASSWORD=123456 \ -v ~/sonarqube_conf:/opt/sonarqube/conf \ -v ~/sonarqube_extensions:/opt/sonarqube/extensions \ -v ~/sonarqube_logs:/opt/sonarqube/logs \ -v ~/sonarqube_data:/opt/sonarqube/data \ sonarqube:7.9.1-community
####上面指定了postgres的地址,用戶名sonar,密碼123456.如果不指定,那么會使用默認的sonar作為賬戶密碼。詳細可以查看sonar的dockerfile#########
上述命令運行結束之后,訪問http://localhost:9000,即可看到對應的頁面,訪問首頁,通過管理員登錄,賬號密碼均為 :admin
參考: