Ein vollständiger Leitfaden zum Laufen Sonarqube mit jedem DB in Docker .
Das Orchestrieren von Docker mit komponieren klingt einfach, aber es gibt einige Fallstricke in der Praxis. Lesen Sie weiter, um mehr über die ganze Geschichte zu erfahren, oder wenn Sie sie nur ausführen möchten, springen Sie direkt zu den Start .
Wenn Sie Sonarqube- und Datenbankcontainer durch komponieren zum ersten Mal zusammen ausführen, können Sie wie folgt auf Fehler stoßen:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').Dies liegt daran, dass der Datenbankinitialisierungsprozess etwas länger dauert als die Startzeit von Sonarqube, insbesondere wenn es keine persistente Datenbank gibt.
Wie kann man den Bereitschaftszustand der Datenbankverbindung erkannt?
Was scheiterte :
depends_on Option : Sie können diese Option in der Datei docker-compose.yml angeben, um Dienste in Abhängigkeitsreihenfolge zu starten. Es wartet jedoch nicht, bis der abhängige Dienst bereit ist.
WAIT-Skript : Das Wait-for-it-Skript, das in Dockers kontrollierende Startauftrag in komponiertem Artikel empfohlen wird, kann verwendet werden, um die Verfügbarkeit des Datenbankports zu überprüfen und zu warten. Leider hilft dies auch nicht. Der Grund dafür ist, dass der Port gleich nach dem Start des Datenbankcontainers verfügbar sein wird. Dies bedeutet jedoch nicht, dass die Datenbankverbindung fertig ist. Vergessen Sie einfach nc -v -n -z -w1 $HOST $PORT .
HEALTHCHECK Anweisung : Diese neue Funktion ist für Dockerfiles seit Version 1.12 verfügbar, jedoch noch nicht für Docker-Compose (jetzt ist es da). Verwendung: HEALTHCHECK [OPTIONS] CMD command . Das klingt vielversprechend, aber Sie müssen den Befehl immer noch selbst schreiben, um Docker zu sagen, was Sie überprüfen sollen.
Datenbankbefehl : Wie wäre es mit mysql -e "select 1" um die Datenbankverfügbarkeit zu überprüfen? Ja - aber warte eine Sekunde - der Sonarqube -Container hat keinen MySQL -Client installiert, und wir haben keine Kontrolle über das offizielle Sonarqube Docker -Bild.
Webserver : Ein weiterer Hack - Was ist, wenn wir einen minimalen (One -Liner-) Webserver im MySQL -Container einrichten, der mit dem Datenbankstatus reagiert? So etwas wie while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done . Leider ist NetCat normalerweise nicht Teil des Datenbankbildes.
Datenbankprotokolle : MySQL schreibt seinen Bereitschaftsstatus in die Protokolle. Vielleicht könnten wir versuchen, dort mit grep 'ready for connections' zu suchen. Normalerweise sind die Protokolle nur im MySQL -Container oder vom Host -Computer, jedoch nicht vom Sonarqube -Behälter, zugänglich. Perhaps we could try to persist MySQL logs to the host directory by adding command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" and volumes: ./data/mysql:/var/log/mysql . Dann konnten wir das Volumen montieren, um ihn mit dem Sonarqube -Behälter zu teilen, damit er dort verfügbar wäre. Aber möchten wir wirklich mit dem Hinzufügen von command und volumes an beiden Seiten beider Dienste anlegen?
Es muss einen besseren Weg geben ...
Was hat funktioniert :
Beginnend mit Sonarqube V7.9 wird es MySQL nicht mehr unterstützen. Weitere Informationen finden Sie in der Unterstützung von MySQL am Ende des Lebens von MySQL. Infolgedessen ignorieren Sie für einen Absatz unten, in denen MySQL erwähnt wird. Es sei denn, Sie möchten MySQL immer noch mit Sonarqube V7.7 (oder früherer Version) verwenden.
Stellen Sie sicher, dass Sie das gesamte Projekt, insbesondere den Detektor.java -, um die Bereitschaft der Datenbank zu überprüfen.
Ziehen Sie die gewünschte Version von Docker Images für Sonarqube und Datenbank (z. B. MySQL oder PostgreSQL ):
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]Heads-up : Es ist keine gute Idee, die neueste Version einer Datenbank direkt zu verwenden, ohne die Sonarqube-Anforderungen zu überprüfen (Voraussetzung für die neueste Sonarqube-Version oder Dokumente für frühere Versionen). Zum Beispiel unterstützt Sonarqube 6.3 nur MySQL 5.6 & 5.7. Und wenn Sie Sonarqube 6.3 mit MySQL 8.0 verspinnen, würde eine Ausnahme ausgelöst:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (Nur optional - nur MySQL & macOS) Es gibt ein Berechtigungsproblem, wenn ein Hostverzeichnis im MySQL -Container mit boot2docker montiert wird.
[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.Lösung :
Erstellen Sie ein benutzerdefiniertes MySQL -Bild für macOS (vergessen Sie nicht, das latest Tag in mysql_mac/Dockerfile zu ändern):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ Bearbeiten Sie Docker-compose-mysql.yml , ersetzen Sie image: mysql nach image: mysql_mac .
Um Daten zu bestehen, müssen Sie Montagedatenvolumina einrichten: zwei Montagepunkte unter Volumina in Docker-Compose- <db> .yml- Datei ersetzen.
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
Hinweis: Der Weg zur anhaltenden Daten zum Host könnte ein relativer Weg sein, z. B.: ./data/xyz
Anstatt das Standard-Leer-Tag oder das dynamische latest Tag zu verwenden, ändern Sie diese bitte in Dockerfile oder docker-compose Datei mit spezifischeren Tags. Weil latest zu unvorhersehbaren und nicht wiederholbaren Bildbusten führen kann.
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up Sonarqubes Plugins.
/opt/sonarqube/extensionsAlle historischen Analysedaten, importierten Regeln, geänderten Einstellungen werden in der Datenbank gespeichert.
/var/lib/mysql
# or
/var/lib/postgresql Behalten Sie die Elasticsearch -Indizes nicht (die sich an /opt/sonarqube/data/es befinden) an, lassen Sie es sich selbst wieder aufbauen, sonst kann es beim Upgrade ein Problem verursachen. Und jede unanständige Abschaltung (z. B. Crash) von Sonarqube könnte zu außer Synchronisierungsindizes führen.
Halten Sie immer eine gesicherte Datenbank bei, falls ein Upgrade fehlschlägt und zurückbackt.
Führen Sie eine logische Sicherung auf der alten Version von MySQL durch
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlStarten Sie einen MySQL Docker -Container (neue Version von MySQL)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashStarten Sie MySQL Server
/etc/init.d/mysql startStarten Sie den MySQL -Client
mysqlErstellen und verwenden Sie die Datenbank
create database sonar ;
use sonar;Gewähren Sie dem Benutzer Berechtigungen
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;Stellen Sie die Sicherungsdatei wieder her (indem Sie das SQL -Skript ausführen)
source / tmp / sonar . sqlBeenden Sie MySQL Client
exitStoppen Sie MySQL Server
/etc/init.d/mysql stopJetzt haben Sie die Datenbank in der neuen Version von MySQL erfolgreich wiederhergestellt. Die Datenbankdaten werden in path_to_persist_db Ihres Hosts gespeichert.
Der Sonarqube Server -Upgrade -Prozess ist automatisiert. Sie haben nichts, was Sie in der Sonarqube -Datenbank manuell ändern können.
Migrationspfad : [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
Upgrade Guide von Sonarqube (nur als Referenz, bitte folgen Sie den folgenden Schritten.)
Versuchen Sie nicht, den Sonarqube -Server zu stoppen. Wenn Sie den Prozess abtöten, geht der Sonarqube -Container sofort aus. Sie können Sonarqube also nicht wirklich in seinem Container aufrüsten. Mach dir keine Sorgen, versuche einfach unter den Schritten.
Schritte:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ;Für das Upgrade von Big Sonarqube erfordert es auch eine Datenbank -Upgrade, dies geschieht jedoch automatisch.
Nachdem der neue Sonarqube -Container abgelaufen ist, werden Sie seine Webseite geöffnet. Sie werden zu einer Wartungsseite umgeleitet.
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Öffnen Sie http: // [your_sonarqube_url]: 9000/setup ;
Klicken Sie auf die Schaltfläche Upgrade .
Das Datenbank -Upgrade kann mehrere Minuten dauern. Wenn die DB-Migration erfolgreich endet, wird auf der Seite "Datenbank auf dem neuesten Stand" angezeigt und Sie dann zur Startseite umgeleitet.
Copyright (C) 2016-2019 Jing Li. Sonarondocker wird unter der GNU Lesser General Public Lizenz, Version 3.0, veröffentlicht. Weitere Informationen finden Sie in der Lizenzdatei.