DockerでDBを使用したSonarqubeを実行するための完全なガイド。
ComposeでDockerを調整するのは簡単ですが、実際にはいくつかの落とし穴があります。ストーリー全体について学ぶために読んでください。または、それを実行したい場合は、直接開始してください。
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の制御されたスタートアップの順序で推奨されるWait-for-for-it Scriptは、データベースポートの可用性を確認して待機するために使用できます。残念ながら、これも役に立ちません。その理由は、データベースコンテナが起動した直後にポートが利用可能になるためですが、それはデータベース接続の準備が整っているという意味ではありません。 nc -v -n -z -w1 $HOST $PORTについて忘れてください。
HEALTHCHECK命令:この新機能は、バージョン1.12以降DockerFilesで利用できますが、まだDocker-Composeでは利用できません(現在はあります)。使用法: HEALTHCHECK [OPTIONS] CMD command 。これは有望に聞こえますが、あなたはまだ自分でコマンドを書く必要があり、Dockerに何をチェックするかを伝える必要があります。
データベースコマンド: mysql -e "select 1"を実行して、データベースの可用性を確認してください。うん - しかし、ちょっと待ってください - Sonarqube Containerには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" and volumes: ./data/mysql:/var/log/mysql 。次に、ボリュームをマウントしてSonarqubeコンテナと共有できます。そうすれば、そこで利用可能になります。しかし、両方のサービスの側にcommandとvolumes構成を追加することを本当に台無しにしたいのでしょうか?
より良い方法がなければなりません…
うまくいったもの:
Sonarqube v7.9から始めて、MySQLをサポートしなくなります。詳細については、MySQLサポートの終了をご覧ください。その結果、MySQLに言及する以下の段落については、無視してください。 Sonarqube v7.7(または以前のバージョン)でMySQLを使用したい場合を除きます。
データベースの準備をチェックするために、プロジェクト全体、特にDetector.javaをクローニングしていることを確認してください。
SonarqubeおよびデータベースのDocker画像の目的バージョン( MySQLまたはPostgreSQLなど)を引く:
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]Heads-up :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ファイルのボリュームの下で2つの取り付けポイントを交換します。
- [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.sqlmysql dockerコンテナ(mysqlの新しいバージョン)を起動します
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashMySQL Serverを起動します
/etc/init.d/mysql startMySQLクライアントを開始します
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 . sqlMySQLクライアントを終了します
exitMySQLサーバーを停止します
/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コンテナが起きた後、そのWebページを開くと、メンテナンスページにリダイレクトされます。
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 modehttp:// [your_sonarqube_url]:9000/setup ;
[アップグレード]ボタンをクリックします。
データベースのアップグレードには数分かかる場合があります。 DBの移行が正常に終了すると、ページに「データベースが最新です」が表示され、ホームページにリダイレクトされます。
Copyright(c)2016-2019 Jing Li。 Sonarondockerは、GNU Lesser一般公開ライセンスバージョン3.0の下でリリースされます。詳細については、ライセンスファイルを参照してください。