Panduan lengkap untuk menjalankan sonarqube dengan db di Docker .
Mengatur Docker dengan Compose Sounds Mudah, tetapi ada beberapa jebakan dalam praktik. Baca terus untuk belajar tentang keseluruhan cerita, atau jika Anda hanya ingin menjalankannya, lompat langsung untuk memulai .
Saat menjalankan sonarqube dan wadah basis data bersama dengan menulis untuk pertama kalinya, Anda mungkin menemukan kesalahan seperti ini:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').Itu karena proses inisialisasi basis data membutuhkan waktu lebih lama dari waktu boot Sonarqube, terutama ketika tidak ada database yang persisten.
Jadi, bagaimana mendeteksi status kesiapan koneksi database?
Apa yang gagal :
Opsi depends_on : Anda dapat menentukan opsi ini dalam file Docker-Compose.yml untuk memulai layanan dalam urutan ketergantungan, tetapi tidak akan menunggu layanan dependen siap.
Tunggu skrip : Skrip tunggu-untuk-IT yang direkomendasikan dalam pesanan startup pengendali Docker di artikel COMPOSE dapat digunakan untuk memeriksa ketersediaan port database dan tunggu. Sayangnya, ini juga tidak membantu. Alasannya adalah bahwa port akan tersedia tepat setelah wadah basis data dimulai, tetapi itu tidak berarti koneksi database siap. Lupakan saja tentang nc -v -n -z -w1 $HOST $PORT .
Instruksi HEALTHCHECK : Fitur baru ini tersedia untuk DockerFiles sejak versi 1.12, tetapi belum untuk komposisi Docker (sekarang ada di sana). Penggunaan: HEALTHCHECK [OPTIONS] CMD command . Ini kedengarannya menjanjikan, tetapi Anda masih harus menulis perintah sendiri, untuk memberi tahu Docker apa yang harus diperiksa.
Perintah Database : Bagaimana kalau menjalankan mysql -e "select 1" untuk memeriksa ketersediaan database? Yap - tapi tunggu sebentar - wadah Sonarqube tidak menginstal klien MySQL, dan kami tidak memiliki kendali atas gambar resmi Sonarqube Docker.
Server Web : Hack lain - Bagaimana jika kita mengatur server web minimal (satu -liner) di wadah MySQL yang merespons dengan status database? Sesuatu seperti while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done . Sayangnya lagi, NetCAT biasanya bukan bagian dari gambar database.
Log Basis Data : MySQL menulis status kesiapannya ke log, jadi mungkin kita bisa mencoba mencari di sana dengan grep 'ready for connections' . Biasanya, log hanya dapat diakses di dalam wadah MySQL, atau dari mesin host, tetapi tidak dari wadah Sonarqube. Mungkin kita bisa mencoba bertahan log mysql ke direktori host dengan menambahkan command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" dan volumes: ./data/mysql:/var/log/mysql . Kemudian kami dapat memasang volume untuk membagikannya dengan wadah Sonarqube, sehingga akan tersedia di sana. Tetapi apakah kita benar -benar ingin mengacaukan dengan menambahkan konfigurasi command dan volumes di sisi kedua layanan?
Harus ada cara yang lebih baik…
Apa yang berhasil :
Dimulai dengan Sonarqube v7.9, itu tidak akan lagi mendukung MySQL. Untuk informasi lebih lanjut, silakan kunjungi Dukungan Akhir Kehidupan MySQL. Akibatnya, untuk setiap paragraf di bawah ini menyebutkan MySQL, tolong abaikan. Kecuali jika Anda masih ingin menggunakan MySQL dengan Sonarqube v7.7 (atau versi sebelumnya).
Pastikan bahwa Anda telah mengkloning seluruh proyek, terutama detektor.java - untuk memeriksa kesiapan database.
Tarik versi gambar Docker yang diinginkan untuk Sonarqube dan Database (misalnya MySQL atau PostgreSQL ):
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]Heads-Up : Bukan ide yang baik untuk secara langsung menggunakan versi terbaru dari database tanpa memeriksa persyaratan sonarqube (prasyarat untuk versi Sonarqube terbaru, atau dokumen untuk versi sebelumnya). Misalnya, Sonarqube 6.3 hanya mendukung MySQL 5.6 & 5.7. Dan jika Anda memutar Sonarqube 6.3 dengan MySQL 8.0, pengecualian akan dilemparkan:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (Opsional - MySQL & MacOS saja) Ada masalah izin saat memasang direktori host dalam wadah MySQL menggunakan 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.Solusi :
Bangun gambar mysql khusus untuk macOS (jangan lupa mengubah tag latest di mysql_mac/Dockerfile ):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ Edit Docker-Compose-mysql.yml , ganti image: mysql dengan image: mysql_mac .
Untuk bertahan data, Anda perlu mengatur volume data pemasangan: Ganti dua titik pemasangan di bawah volume dalam file docker-compose- <db> .ml .
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
Catatan: Jalur untuk bertahan data pada host bisa menjadi jalur relatif, misalnya: ./data/xyz
Alih-alih menggunakan tag kosong default atau tag latest yang dinamis, harap ubahnya di Dockerfile atau file docker-compose dengan tag yang lebih spesifik. Karena latest dapat menyebabkan pembuatan gambar yang tidak dapat diprediksi dan tidak dapat diulang.
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up Plugin Sonarqube.
/opt/sonarqube/extensionsSemua data analisis historis, aturan impor, pengaturan yang diubah disimpan dalam database.
/var/lib/mysql
# or
/var/lib/postgresql Jangan bertahan indeks Elasticsearch (yang terletak di /opt/sonarqube/data/es ), biarkan itu membangun kembali dengan sendirinya, jika tidak dapat menyebabkan masalah selama peningkatan. Dan shutdown yang tidak enak (seperti kecelakaan) Sonarquce dapat menyebabkan indeks yang tidak sinkron.
Selalu simpan database yang dicadangkan jika terjadi peningkatan gagal dan roll kembali diperlukan.
Lakukan cadangan logis pada versi lama MySQL
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlMulai wadah Docker MySQL (versi baru MySQL)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashMulai server MySQL
/etc/init.d/mysql startMulai klien MySQL
mysqlBuat dan gunakan database
create database sonar ;
use sonar;Hibah hak istimewa kepada pengguna
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;Kembalikan file cadangan (dengan mengeksekusi skrip SQL)
source / tmp / sonar . sqlBerhenti klien MySQL
exitHentikan server MySQL
/etc/init.d/mysql stopSekarang Anda telah berhasil memulihkan database pada versi baru MySQL. Data database disimpan dalam path_to_persist_db dari host Anda.
Proses peningkatan server Sonarqube diotomatisasi, Anda tidak memiliki apa pun untuk diubah secara manual dalam database Sonarqube.
Jalur Migrasi : [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
Panduan Peningkatan oleh Sonarqube (hanya untuk referensi, silakan ikuti langkah -langkah di bawah ini.)
Jangan mencoba menghentikan server Sonarqube, jika Anda membunuh prosesnya, wadah Sonarqube segera keluar. Jadi Anda tidak dapat benar -benar meningkatkan Sonarqube dengan tangan di dalam wadahnya. Jangan khawatir, coba saja langkah -langkah di bawah ini.
Tangga:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ;Untuk peningkatan Big Sonarqube, ini juga memerlukan peningkatan basis data, tetapi ini terjadi secara otomatis.
Setelah wadah Sonarqube yang baru naik, buka halaman webnya, Anda akan diarahkan ke halaman pemeliharaan;
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 modeBuka http: // [your_sonarqube_url]: 9000/setup ;
Klik tombol Upgrade .
Peningkatan basis data dapat memakan waktu beberapa menit. Ketika migrasi DB berakhir dengan sukses, halaman akan menampilkan "database terkini", kemudian mengarahkan Anda ke halaman beranda.
Hak Cipta (C) 2016-2019 Jing Li. Sonarondocker dirilis di bawah GNU Lesser General Public License, versi 3.0. Lihat file lisensi untuk detailnya.