คำแนะนำที่สมบูรณ์เกี่ยวกับการเรียกใช้ Sonarqube ด้วยฐานข้อมูลใด ๆ ใน 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 ในบทความ Compose สามารถใช้เพื่อตรวจสอบความพร้อมใช้งานของพอร์ตฐานข้อมูลและรอ น่าเสียดายที่สิ่งนี้ไม่ได้ช่วยได้เช่นกัน เหตุผลก็คือพอร์ตจะพร้อมใช้งานหลังจากที่คอนเทนเนอร์ฐานข้อมูลเริ่มต้น แต่นั่นไม่ได้หมายความว่าการเชื่อมต่อฐานข้อมูลพร้อมแล้ว เพียงแค่ลืมเกี่ยวกับ nc -v -n -z -w1 $HOST $PORT
คำแนะนำ HEALTHCHECK : คุณสมบัติใหม่นี้มีให้สำหรับ DockerFiles ตั้งแต่เวอร์ชัน 1.12 แต่ยังไม่ได้สำหรับนักเทียบท่า (ตอนนี้อยู่ที่นั่น) การใช้งาน: HEALTHCHECK [OPTIONS] CMD command ฟังดูมีแนวโน้ม แต่คุณยังต้องเขียนคำสั่งด้วยตัวเองเพื่อบอก Docker ว่าจะตรวจสอบอะไร
คำสั่งฐานข้อมูล : วิธีการเรียกใช้ mysql -e "select 1" เพื่อตรวจสอบความพร้อมใช้งานของฐานข้อมูล? ใช่ - แต่รอสักครู่ - คอนเทนเนอร์ Sonarqube ไม่ได้ติดตั้งไคลเอนต์ MySQL และเราไม่สามารถควบคุมภาพ Docker Sonarqube Docker อย่างเป็นทางการได้
เว็บเซิร์ฟเวอร์ : แฮ็คอื่น - ถ้าเราตั้งค่าเว็บเซิร์ฟเวอร์ขั้นต่ำ (หนึ่งซับ) ในคอนเทนเนอร์ MySQL ที่ตอบกลับด้วยสถานะฐานข้อมูล บางอย่าง 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 บางทีเราอาจลองใช้บันทึก MySQL ไปยังไดเรกทอรีโฮสต์โดยการเพิ่ม command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" volumes: ./data/mysql:/var/log/mysql จากนั้นเราสามารถเพิ่มระดับเสียงเพื่อแบ่งปันกับคอนเทนเนอร์ Sonarqube เพื่อที่จะได้มีให้ที่นั่น แต่เราต้องการยุ่งกับการเพิ่ม command และการกำหนด volumes ในด้านบริการทั้งสองหรือไม่?
จะต้องมีวิธีที่ดีกว่า ...
สิ่งที่ได้ผล :
เริ่มต้นด้วย Sonarqube v7.9 มันจะไม่สนับสนุน MySQL อีกต่อไป สำหรับข้อมูลเพิ่มเติมกรุณาเยี่ยมชม End of Life of MySQL เป็นผลให้สำหรับย่อหน้าใด ๆ ด้านล่างที่กล่าวถึง MySQL โปรดเพิกเฉย เว้นแต่คุณจะยังคงต้องการใช้ MySQL กับ Sonarqube v7.7 (หรือเวอร์ชันก่อนหน้า)
ตรวจสอบให้แน่ใจว่าคุณได้โคลนโครงการทั้งหมดโดยเฉพาะอย่างยิ่ง detector.java - สำหรับการตรวจสอบความพร้อมของฐานข้อมูล
ดึงเวอร์ชันที่ต้องการของ Docker Images สำหรับ Sonarqube และฐานข้อมูล (เช่น 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 เท่านั้น และถ้าคุณหมุน Sonarqube 6.3 ด้วย MySQL 8.0 ข้อยกเว้นจะถูกโยน:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (เป็นทางเลือก - MySQL & MacOS เท่านั้น) มีปัญหาการอนุญาตเมื่อติดตั้งไดเรกทอรีโฮสต์ในคอนเทนเนอร์ MySQL โดยใช้ 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.สารละลาย :
สร้างภาพ mysql ที่กำหนดเองสำหรับ macOS (อย่าลืมเปลี่ยนแท็ก latest ใน mysql_mac/Dockerfile ):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ แก้ไข Docker-compose-mysql.yml , แทนที่ image: mysql ตาม image: mysql_mac
เพื่อที่จะคงข้อมูลคุณต้องตั้งค่าปริมาณข้อมูลการติดตั้ง: แทนที่จุดติดตั้งสองจุดภายใต้ปริมาตรในไฟล์ Docker-compose- <DB> .yml
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
หมายเหตุ: เส้นทางที่จะคงข้อมูลบนโฮสต์อาจเป็นเส้นทางที่สัมพันธ์กันเช่น: ./data/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.sqlเริ่มคอนเทนเนอร์ MySQL Docker (MySQL เวอร์ชันใหม่)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashเริ่มต้นเซิร์ฟเวอร์ MySQL
/etc/init.d/mysql startเริ่มไคลเอนต์ MySQL
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 . sqlออกจากไคลเอนต์ MySQL
exitหยุดเซิร์ฟเวอร์ MySQL
/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 ;สำหรับการอัพเกรด Sonarqube ขนาดใหญ่มันยังต้องมีการอัพเกรดฐานข้อมูล แต่สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติ
หลังจากที่คอนเทนเนอร์ Sonarqube ใหม่เปิดขึ้นแล้วเปิดหน้าเว็บคุณจะถูกนำไปยังหน้าการบำรุงรักษา
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เปิด http: // [your_sonarqube_url]: 9000/setup ;
คลิกปุ่ม อัปเกรด
การอัพเกรดฐานข้อมูลอาจใช้เวลาหลายนาที เมื่อการโยกย้ายฐานข้อมูลสิ้นสุดลงสำเร็จหน้าจะแสดง "ฐานข้อมูลเป็นข้อมูลล่าสุด" จากนั้นนำคุณไปยังหน้าแรก
ลิขสิทธิ์ (c) 2016-2019 Jing Li Sonarondocker ได้รับการปล่อยตัวภายใต้ใบอนุญาตสาธารณะ GNU Lesser ทั่วไปเวอร์ชัน 3.0 ดูไฟล์ใบอนุญาตสำหรับรายละเอียด