Полное руководство по бегу Sonarqube с любым БД в Docker .
Орчестируя Docker с звуками Compose Sounds, но на практике есть несколько ловушек. Читайте дальше, чтобы узнать обо всей истории, или если вы просто хотите ее запустить, прыгните непосредственно на начало .
При использовании контейнеров 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, но еще не для Docker-Compose (теперь она есть). Использование: HEALTHCHECK [OPTIONS] CMD command . Это звучит многообещающе, но вы все равно должны написать команду самостоятельно, чтобы рассказать Docker, что проверить.
Команда базы данных : как насчет запуска mysql -e "select 1" чтобы проверить доступность базы данных? Да, но подождите секунду - в контейнере Sonarqube не установлен клиент MySQL, и мы не контролируем официальное изображение Docker Sonarqube.
Веб -сервер : Еще один взлом - что, если мы настроем минимальный (однострочный) веб -сервер в контейнере 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 для Sonarqube и базы данных (EG 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>. Myml файл.
- [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 Плагины Сонаркубе.
/opt/sonarqube/extensionsВсе данные исторического анализа, импортированные правила, измененные настройки сохраняются в базе данных.
/var/lib/mysql
# or
/var/lib/postgresql Не сохраняйте индексы Elasticsearch (которые расположены AT /opt/sonarqube/data/es ), пусть он восстанавливается само по себе, в противном случае это может вызвать проблемы во время обновления. И любое невосприимчивое отключение (например, авария) Sonarqube может привести к индексам вне синхронизации.
Всегда сохраняйте резервную копию базы данных в случае сбоя обновления, и необходим откат.
Выполните логическую резервную копию на старой версии MySQL
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlНачните контейнер Docker MySQL (новая версия 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 Script)
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 ;Для обновления Big 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 ;
Нажмите кнопку обновления .
Обновление базы данных может занять несколько минут. Когда миграция DB успешно заканчивается, на странице будет отображаться «база данных обновлена», а затем перенаправить вас на домашнюю страницу.
Авторские права (C) 2016-2019 Jing Li. Sonarondocker выпускается по GNU Lesser General Public Public License, версия 3.0. Смотрите файл лицензии для получения подробной информации.