Un guide complet pour exécuter Sonarqube avec n'importe quelle base de données dans Docker .
Orchestrer Docker avec Composer semble facile, mais il y a quelques pièges dans la pratique. Lisez la suite pour en savoir plus sur toute l'histoire, ou si vous voulez simplement l'exécuter, sautez directement pour commencer .
Lors de l'exécution de sonarqube et des conteneurs de base de données ensemble par compose pour la première fois, vous pouvez rencontrer des erreurs comme ceci:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').C'est parce que le processus d'initialisation de la base de données prend un peu plus de temps que le temps de démarrage de Sonarqube, surtout lorsqu'il n'y a pas de base de données persistante.
Alors, comment détecter l'état de préparation de la connexion de la base de données?
Ce qui a échoué :
Option depends_on : Vous pouvez spécifier cette option dans le fichier docker-compose.yml pour démarrer les services dans la commande de dépendance, mais il n'attendra pas que le service dépendant soit prêt.
Script d'attente : le script d'attente recommandé dans l'ordre de démarrage de Docker de Docker dans l'article Compose peut être utilisé pour vérifier la disponibilité du port de base de données et attendre. Malheureusement, cela n'aide pas non plus. La raison en est que le port sera disponible juste après le début du conteneur de la base de données, mais cela ne signifie pas que la connexion de la base de données est prête. Oubliez simplement nc -v -n -z -w1 $HOST $PORT .
Instruction HEALTHCHECK : cette nouvelle fonctionnalité est disponible pour Dockerfiles depuis la version 1.12, mais pas encore pour Docker-Compose (maintenant il est là). Utilisation: HEALTHCHECK [OPTIONS] CMD command . Cela semble prometteur, mais vous devez toujours écrire la commande par vous-même, pour dire à Docker quoi vérifier.
Commande de base de données : que diriez-vous de l'exécution mysql -e "select 1" pour vérifier la disponibilité de la base de données? Oui - mais attendez une seconde - le conteneur Sonarqube n'a pas installé de client MySQL, et nous n'avons aucun contrôle sur l'image officielle de Docker Sonarqube.
Serveur Web : Encore un autre hack - que se passe-t-il si nous configurons un serveur Web minimal (une ligne) dans le conteneur MySQL qui répond avec l'état de la base de données? Quelque chose comme while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done . Malheureusement, NetCAT ne fait généralement pas partie de l'image de la base de données.
Journaux de la base de données : MySQL écrit son état de préparation aux journaux, alors peut-être que nous pourrions essayer de rechercher là-bas avec grep 'ready for connections' . Normalement, les journaux ne sont accessibles que dans le conteneur MySQL, ou à partir de la machine hôte, mais pas à partir du conteneur Sonarqube. Peut-être pourrions-nous essayer de persister des journaux mysql au répertoire hôte en ajoutant command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" et volumes: ./data/mysql:/var/log/mysql . Ensuite, nous pourrions monter le volume pour le partager avec le conteneur Sonarqube, afin qu'il y soit disponible. Mais voulons-nous vraiment jouer avec l'ajout de configurations command et volumes sur les côtés des deux services?
Il doit y avoir une meilleure façon…
Ce qui a fonctionné :
En commençant par Sonarqube v7.9, il ne prendra plus en charge MySQL. Pour plus d'informations, veuillez visiter la fin de la vie du support MySQL. En conséquence, pour tout paragraphe ci-dessous mentionnant MySQL, veuillez ignorer. À moins que vous ne vouliez toujours utiliser MySQL avec Sonarqube v7.7 (ou version antérieure).
Assurez-vous que vous avez cloné l'ensemble du projet, en particulier le détecteur.java - pour vérifier la préparation de la base de données.
Tirez la version souhaitée des images Docker pour Sonarqube et la base de données (par exemple MySQL ou PostgreSQL ):
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]Tête-à-tête : ce n'est pas une bonne idée d'utiliser directement la dernière version d'une base de données sans vérifier les exigences de Sonarqube (condition préalable à la dernière version de Sonarqube, ou documents pour les versions précédentes). Par exemple, Sonarqube 6.3 ne prend en charge que MySQL 5.6 & 5.7. Et si vous tournez sonarqube 6.3 avec MySQL 8.0, une exception serait lancée:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (Facultatif - MySQL & MacOS uniquement) Il y a un problème d'autorisation lors du montage d'un répertoire d'hôte dans le conteneur MySQL à l'aide de 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.Solution :
Créez une image MySQL personnalisée pour macOS (n'oubliez pas de modifier la latest balise dans mysql_mac/Dockerfile ):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ Éditer docker-compose-mysql.yml , remplacer image: mysql par image: mysql_mac .
Afin de persister des données, vous devez configurer des volumes de données de montage: remplacez deux points de montage sous des volumes dans le fichier docker-compose- <db> .yml .
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
Remarque: Le chemin de persistance des données sur l'hôte pourrait être un chemin relatif, par exemple: ./data/xyz
Au lieu d'utiliser la balise vide par défaut ou latest balise dynamique, veuillez les modifier dans Dockerfile ou docker-compose File avec des balises plus spécifiques. Parce que latest peuvent conduire à des constructions d'images imprévisibles et non répatiables.
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up Plugins de Sonarqube.
/opt/sonarqube/extensionsToutes les données d'analyse historique, les règles importées, les paramètres modifiés sont enregistrés dans la base de données.
/var/lib/mysql
# or
/var/lib/postgresql Ne persistez pas les indices Elasticsearch (qui se trouvent sur /opt/sonarqube/data/es ), laissez-le reconstruire par lui-même, sinon cela pourrait causer un problème lors de la mise à niveau. Et toute fermeture ingrat (comme le crash) de Sonarqube pourrait conduire à des indices hors synchronisation.
Gardez toujours une base de données sauvegardée dans le cas où la mise à niveau des échecs et le retour est nécessaire.
Effectuez une sauvegarde logique sur l'ancienne version de MySQL
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlDémarrez un conteneur Docker MySQL (nouvelle version de MySQL)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashDémarrer MySQL Server
/etc/init.d/mysql startDémarrer le client MySQL
mysqlCréer et utiliser la base de données
create database sonar ;
use sonar;Accorder des privilèges à l'utilisateur
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;Restaurer le fichier de sauvegarde (en exécutant le script SQL)
source / tmp / sonar . sqlQuittez le client MySQL
exitArrêter le serveur MySQL
/etc/init.d/mysql stopVous avez maintenant réussi à restaurer la base de données sur la nouvelle version de MySQL. Les données de la base de données sont stockées dans path_to_persist_db de votre hôte.
Le processus de mise à niveau du serveur Sonarqube est automatisé, vous n'avez rien à changer manuellement dans la base de données Sonarqube.
Chemin de migration : [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
Guide de mise à niveau de Sonarqube (juste pour référence, veuillez suivre les étapes ci-dessous.)
N'essayez pas d'arrêter le serveur Sonarqube, si vous tuez le processus, le conteneur Sonarqube sort immédiatement. Vous ne pouvez donc pas vraiment mettre à niveau Sonarqube à la main dans son conteneur. Ne vous inquiétez pas, essayez simplement ci-dessous les étapes.
Mesures:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ;Pour la mise à niveau de Big Sonarqube, cela nécessite également une mise à niveau de la base de données, mais cela se produit automatiquement.
Une fois le nouveau conteneur Sonarqube, ouvrir sa page Web, vous serez redirigé vers une page de maintenance;
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 modeOuvrir http: // [your_sonarqube_url]: 9000 / configuration ;
Cliquez sur le bouton de mise à niveau .
La mise à niveau de la base de données peut prendre plusieurs minutes. Lorsque la migration DB se termine avec succès, la page affichera "la base de données est à jour", puis vous redirigera vers la page d'accueil.
Copyright (C) 2016-2019 Jing Li. Sonarondocker est publié sous la licence publique GNU Unser General, version 3.0. Voir le fichier de licence pour plus de détails.