Docker搭建Sonarqube服务(一)
一、背景
为了保证外包项目的质量,我们需要搭建一个代码扫描的工具,减少人工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
参考: