如何在Sonarqube Docker镜像中跨容器调用持久化配置和分析数据

14

Sonarqube官方Docker镜像并不会保存任何配置更改,例如:创建用户、更改root密码或者安装新的插件

一旦容器重启,所有的配置更改都会消失,安装的插件也会丢失。甚至项目的密钥和之前的QA分析数据在重启后也无法获得。

当使用Sonarqube官方Docker镜像时,我们该如何保留数据呢?

3个回答

21
  • Sonarqube镜像带有一个临时的h2数据库引擎,不建议在生产环境中使用,而且不会在容器重启后持久化。
  • 我们需要设置自己的数据库,并在启动容器时将其指向Sonarqube。
  • Sonarqube docker镜像从Sonarqube Dockerfile中可以看到两个卷:"$SONARQUBE_HOME/data", "$SONARQUBE_HOME/extensions"

由于我们想要在调用之间保存数据,所以我们需要确保设置了一个生产级别的数据库并将其链接到Sonarqube,然后创建扩展目录并将其作为主机上的卷挂载,以便所有下载的插件都可以在容器调用之间保留,并且可以被多个容器使用(如果需要)。

数据库设置:

create database sonar;
grant all on sonar.* to `sonar`@`%` identified by "SOME_PASSWORD";
flush privileges;

# since we do not know the containers IP before hand, we use '%' for sonarqube host IP.

不需要创建表格,如果Sonarqube找不到表格,它会自动创建。

启动Sonarqube容器:

# create a directory on host
mkdir /server_data/sonarqube/extensions
mkdir /server_data/sonarqube/data # this will be useful in saving startup time

# Start the container
docker run -d \
    --name sonarqube \
    -p 9000:9000 \
    -e SONARQUBE_JDBC_USERNAME=sonar \
    -e SONARQUBE_JDBC_PASSWORD=SOME_PASSWORD \
    -e SONARQUBE_JDBC_URL="jdbc:mysql://HOST_IP_OF_DB_SERVER:PORT/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" \
    -v /server_data/sonarqube/data:/opt/sonarqube/data \
    -v /server_data/sonarqube/extensions:/opt/sonarqube/extensions \
    sonarqube

6

大家好,@VanagaS和其他人。我想提供一种替代方案,也许有些人甚至认为这是一种更容易的方法。

请注意Dockerfile中的这一行SONARQUBE_HOME用于docker-sonarqube镜像。我们可以控制此环境变量。

使用docker run时,只需执行以下操作:

txt docker run -d \ ... ... -e SONARQUBE_HOME=/sonarqube-data -v /PERSISTENT_DISK/sonarqubeVolume:/sonarqube-data

这将使Sonarqube创建conf、data等文件夹,并在其中存储数据。按需使用。


或者,在你的Kubernetes部署YAML文件中。执行以下操作:

txt ... ... env: - name: SONARQUBE_HOME value: /sonarqube-data ... ... volumeMounts: - name: app-volume mountPath: /sonarqube-data

volumeMounts属性中的name指向Kubernetes部署YAML文件中volumes部分中的卷。这将使Sonarqube使用/sonarqube-data挂载路径来创建扩展、conf等文件夹, 然后在其中保存数据。

您的Sonarqube数据现在得到了持久化,就这么简单。

希望这会帮助其他人。

注意,YAML和Docker运行示例不是详尽无遗的,它们关注于持久化Sonarqube数据的问题。


3
如果您仍在评估(即不想设置“真实”数据库),但希望您的数据在容器重新启动后仍然存在,那么这是一个不错的方法。请注意,较新的SonarQube版本似乎忽略SONARQUBE_HOME并代之以SONAR_PATH_DATA,参见环境变量(我尝试过8.7社区版)。谢谢! - Till Kuhn

0

自Sonarqube v7.9起,不再支持Mysql,需要使用postgresql。安装Postgresql并配置为在主机IP上运行,而不是本地主机,首选私有IP。

参考:https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04

postgres=# create database sonar;
postgres=# create user sonar with encrypted password 'mypass';
postgres=# grant all privileges on database sonar to sonar;

在主机上创建一个目录

mkdir /server_data/sonarqube/extensions
mkdir /server_data/sonarqube/data # this will be useful in saving startup time

启动容器

docker run -d
--name sonarqube
-p 9000:9000
-e SONARQUBE_JDBC_USERNAME=sonar
-e SONARQUBE_JDBC_PASSWORD=mypass
-e SONARQUBE_JDBC_URL=jdbc:postgresql://{host/private ip only}:5432/sonar
-v /server_data/sonarqube/data:/opt/sonarqube/data
-v /server_data/sonarqube/extensions:/opt/sonarqube/extensions
sonarqube

当你执行 "docker logs container_id" 时可能会遇到以下错误

错误:[1] 引导检查失败 [1]: max virtual memory areas vm.max_map_count [65530] 过低,请至少增加到 [262144]

以下是解决方案,请在宿主机上运行

sysctl -w vm.max_map_count=262144

为了添加主机名,请编辑/etc/postgresql/10/main/postgresql.conf 为了将docker作为postgres客户端添加,请编辑/etc/postgresql/10/main/pg_hba.conf 10-使用的postgres版本

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接