Una guía completa para ejecutar Sonarqube con cualquier DB en Docker .
Orchestrar Docker con composición suena fácil, pero hay algunas dificultades en la práctica. Siga leyendo para aprender sobre toda la historia, o si solo quieres ejecutarla, salta directamente a comenzar .
Al ejecutar Sonarqube y contenedores de base de datos juntos por composición por primera vez, puede encontrar errores como este:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').Es porque el proceso de inicialización de la base de datos lleva un poco más tiempo que el tiempo de arranque de Sonarqube, especialmente cuando no hay una base de datos persistente.
Entonces, ¿cómo detectar el estado de preparación de la conexión de la base de datos?
Lo que falló :
Opción depends_on : puede especificar esta opción en el archivo Docker-Compose.yml para iniciar servicios en orden de dependencia, pero no esperará que el servicio dependiente esté listo.
Script de espera : el script de espera por-it recomendado en el orden de inicio de control de Docker en el artículo Compose se puede utilizar para verificar la disponibilidad del puerto de la base de datos y esperar. Desafortunadamente, esto tampoco ayuda. La razón es que el puerto estará disponible justo después de que comience el contenedor de la base de datos, pero eso no significa que la conexión de la base de datos esté lista. Simplemente olvídate de nc -v -n -z -w1 $HOST $PORT .
Instrucción HEALTHCHECK : esta nueva característica está disponible para DockerFiles desde la versión 1.12, pero aún no para Docker-Compose (ahora está allí). Uso: HEALTHCHECK [OPTIONS] CMD command . Esto suena prometedor, pero aún tiene que escribir el comando por su cuenta, para decirle a Docker qué verificar.
Comando de la base de datos : ¿Qué tal ejecutar mysql -e "select 1" para verificar la disponibilidad de la base de datos? Sí, pero espere un segundo: el contenedor Sonarqube no tiene instalado un cliente MySQL, y no tenemos control sobre la imagen oficial de Sonarqube Docker.
Servidor web : otro hack más: ¿qué pasa si configuramos un servidor web mínimo (de una sola) en el contenedor MySQL que responde con el estado de la base de datos? Algo así como while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done . Desafortunadamente, nuevamente, NetCat generalmente no es parte de la imagen de la base de datos.
Registros de bases de datos : MySQL escribe su estado de preparación para los registros, por lo que tal vez podríamos intentar buscar allí con grep 'ready for connections' . Normalmente, los registros solo se pueden acceder dentro del contenedor MySQL, o desde la máquina host, pero no desde el contenedor Sonarqube. Tal vez podríamos intentar persistir los registros de MySQL al directorio de host agregando command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" y volumes: ./data/mysql:/var/log/mysql . Luego podríamos montar el volumen para compartirlo con el contenedor Sonarqube, para que estuviera disponible allí. Pero, ¿realmente queremos meternos con la adición de configuraciones command y volumes en ambos lados de los servicios?
Tiene que haber una mejor manera ...
Lo que funcionó :
Comenzando con Sonarqube V7.9, ya no apoyará a MySQL. Para obtener más información, visite el apoyo de Life of MySQL. Como resultado, para cualquier párrafo a continuación mencionando MySQL, ignore. A menos que aún desee usar MySQL con Sonarqube V7.7 (o versión anterior).
Asegúrese de que haya clonado todo el proyecto, particularmente el detector.java , para verificar la preparación de la base de datos.
Tire de la versión deseada de Docker Images para Sonarqube y Base de datos (por ejemplo, MySQL o PostgreSQL ):
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]HEADS-UP : No es una buena idea usar directamente la última versión de una base de datos sin verificar los requisitos de Sonarqube (requisito previo para la última versión de Sonarqube o documentos para versiones anteriores). Por ejemplo, Sonarqube 6.3 solo admite MySQL 5.6 y 5.7. Y si giras Sonarqube 6.3 con MySQL 8.0, se lanzaría una excepción:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (Opcional: solo MySQL & MacOS) Hay un problema de permiso al montar un directorio de host en el contenedor MySQL usando boot2docker .
[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.Solución :
Cree una imagen MySQL personalizada para MacOS (no olvide cambiar la latest etiqueta en mysql_mac/Dockerfile ):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ Editar Docker-Compose-Mysql.yml , Reemplace image: mysql por image: mysql_mac .
Para persistir en datos, debe configurar los volúmenes de datos de montaje: reemplace dos puntos de montaje bajo volúmenes en el archivo Docker-Compose- <db> .yml .
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
Nota: La ruta para persistir en los datos sobre el host podría ser una ruta relativa, por ejemplo: ./data/xyz
En lugar de usar una etiqueta vacía vacía predeterminada o latest etiqueta dinámica, alterarlos en Dockerfile o docker-compose File con etiquetas más específicas. Porque latest pueden conducir a compilaciones de imágenes impredecibles e irrepetibles.
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up Complementos de Sonarqube.
/opt/sonarqube/extensionsTodos los datos de análisis históricos, las reglas importadas, la configuración cambiada se guardan en la base de datos.
/var/lib/mysql
# or
/var/lib/postgresql No persista los índices Elasticsearch (que se encuentra en /opt/sonarqube/data/es ), que se reconstruya por sí mismo, de lo contrario podría causar problemas durante la actualización. Y cualquier cierre sin gracia (como Crash) de Sonarqube podría conducir a índices fuera de sincronización.
Siempre mantenga una base de datos respaldada en caso de que la actualización falle y se necesita retroceder.
Realice una copia de seguridad lógica en la versión anterior de MySQL
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlIniciar un contenedor de Docker MySQL (nueva versión de MySQL)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashIniciar servidor MySQL
/etc/init.d/mysql startIniciar cliente MySQL
mysqlCrear y usar la base de datos
create database sonar ;
use sonar;Otorgar privilegios al usuario
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;Restaurar el archivo de copia de seguridad (ejecutando el script SQL)
source / tmp / sonar . sqlDejar el cliente mysql
exitDetener el servidor MySQL
/etc/init.d/mysql stopAhora ha restaurado con éxito la base de datos en la nueva versión de MySQL. Los datos de la base de datos se almacenan en PATH_TO_PERSIST_DB de su host.
El proceso de actualización del servidor Sonarqube está automatizado, no tiene nada que cambiar manualmente en la base de datos Sonarqube.
Ruta de migración : [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
Guía de actualización por Sonarqube (solo como referencia, siga los pasos a continuación).
No intente detener el servidor Sonarqube, si mata el proceso, el contenedor Sonarqube sale de inmediato. Por lo tanto, realmente no puede actualizar Sonarqube a mano dentro de su contenedor. No se preocupe, solo intente los pasos a continuación.
Pasos:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ;Para la actualización de Big Sonarqube, también requiere la actualización de la base de datos, pero esto sucede automáticamente.
Después de que el nuevo contenedor Sonarqube esté activo, abra su página web, será redirigido a una página de mantenimiento;
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 modeAbra http: // [your_sonarqube_url]: 9000/configuración ;
Haga clic en el botón Actualizar .
La actualización de la base de datos puede tomar varios minutos. Cuando la migración de DB termina con éxito, la página mostrará "la base de datos está actualizada", luego lo redirigirá a la página de inicio.
Copyright (c) 2016-2019 Jing Li. Sonarondocker se lanza bajo la Licencia Pública General Lesser de GNU, versión 3.0. Consulte el archivo de licencia para obtener más detalles.