与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。有关详细信息,请参见许可证文件。