Um guia completo para executar o Sonarqube com qualquer banco de dados em Docker .
Orquestrar o docker com composição parece fácil, mas existem algumas armadilhas na prática. Continue lendo para aprender sobre a história toda ou, se você só quiser executá -la, pule diretamente para começar .
Ao executar o Sonarqube e os contêineres de banco de dados juntos pela primeira vez, você pode encontrar erros como este:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').É porque o processo de inicialização do banco de dados leva um pouco mais do que o tempo de inicialização do Sonarqube, especialmente quando não há banco de dados persistente.
Então, como detectar o estado de prontidão da conexão do banco de dados?
O que falhou :
depends_on da opção_on : você pode especificar esta opção no arquivo Docker-compompose.yml para iniciar os serviços na ordem de dependência, mas não aguarda o serviço de dependente estar pronto.
Script Wait : O script Wait-For-It recomendado na ordem de inicialização do Docker no Docker no Artigo de Composição pode ser usado para verificar a disponibilidade da porta do banco de dados e esperar. Infelizmente, isso também não ajuda. O motivo é que a porta estará disponível logo após o início do contêiner do banco de dados, mas isso não significa que a conexão do banco de dados esteja pronta. Basta esquecer o nc -v -n -z -w1 $HOST $PORT .
Instrução HEALTHCHECK : Este novo recurso está disponível para o Dockerfiles desde a versão 1.12, mas ainda não para o Docker-Compompose (agora está lá). Uso: HEALTHCHECK [OPTIONS] CMD command . Isso parece promissor, mas você ainda precisa escrever o comando por conta própria, para dizer ao Docker o que verificar.
Comando do banco de dados : que tal executar mysql -e "select 1" para verificar a disponibilidade do banco de dados? Sim - mas espere um segundo - o contêiner Sonarqube não possui um cliente MySQL instalado e não temos controle sobre a imagem oficial do Sonarqube Docker.
Servidor da Web : Mais um hack - e se configurarmos um servidor Web mínimo (de uma linha) no contêiner MySQL que responde com o status do banco de dados? Algo como while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done . Infelizmente, novamente, o NetCat geralmente não faz parte da imagem do banco de dados.
Logs do banco de dados : o MySQL grava seu status de prontidão nos logs, então talvez possamos tentar pesquisar lá com grep 'ready for connections' . Normalmente, os logs são acessíveis apenas no contêiner MySQL ou na máquina host, mas não no contêiner Sonarqube. Talvez possamos tentar persistir logs mysql no diretório host adicionando command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" e volumes: ./data/mysql:/var/log/mysql Em seguida, poderíamos montar o volume para compartilhá -lo com o contêiner Sonarqube, para que ele estivesse disponível lá. Mas realmente queremos mexer com a adição de configurações command e volumes nas laterais de ambos os serviços?
Tem que haver uma maneira melhor ...
O que funcionou :
Começando com Sonarqube v7.9, ele não apoiará mais o MySQL. Para mais informações, visite o final da vida do suporte ao MySQL. Como resultado, para qualquer parágrafo abaixo mencionando MySQL, ignore. A menos que você ainda queira usar o MySQL com Sonarqube v7.7 (ou versão anterior).
Certifique -se de que você clonou todo o projeto, particularmente o detector.java - para verificar a prontidão do banco de dados.
Puxe a versão desejada das imagens do Docker para Sonarqube e Database (por exemplo, MySQL ou PostgreSQL ):
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]Heads-up : não é uma boa idéia usar diretamente a versão mais recente de um banco de dados sem verificar os requisitos do Sonarqube (pré-requisito para a versão mais recente do Sonarqube, ou documentos para versões anteriores). Por exemplo, o Sonarqube 6.3 suporta apenas o MySQL 5.6 e 5.7. E se você girar Sonarqube 6.3 com o MySQL 8.0, uma exceção seria lançada:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (Opcional - Somente MySQL & MacOS) Há um problema de permissão ao montar um diretório host no contêiner MySQL usando 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.Solução :
Construa uma imagem MySQL personalizada para macOS (não se esqueça de alterar a tag latest em mysql_mac/Dockerfile ):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ Edite Docker-Comppose-mysql.yml , substitua image: mysql por image: mysql_mac .
Para persistir dados, você precisa configurar volumes de dados de montagem: substitua dois pontos de montagem em volumes no arquivo Docker-Compose- <db> .yml .
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
Nota: O caminho para persistir dados no host pode ser um caminho relativo, por exemplo: ./data/xyz
Em vez de usar a tag vazia padrão ou latest tag dinâmica, altere-as no arquivo Dockerfile ou docker-compose com tags mais específicas. Porque latest pode levar a compilações de imagem imprevisíveis e não repetíveis.
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up Plugins de Sonarqube.
/opt/sonarqube/extensionsTodos os dados de análise histórica, regras importadas, configurações alteradas são salvas no banco de dados.
/var/lib/mysql
# or
/var/lib/postgresql Não persiste os índices de pesquisa ELÁSTICA (localizada em /opt/sonarqube/data/es ), deixe -o reconstruir por si só, caso contrário, poderá causar problemas durante a atualização. E qualquer desligamento ingleo (como Crash) do Sonarqube poderia levar a índices fora de sincronia.
Sempre mantenha um banco de dados de backup , caso seja necessária uma falha de atualização e reversão.
Execute um backup lógico na versão antiga do MySQL
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlInicie um contêiner MySQL Docker (nova versão do MySQL)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashInicie o MySQL Server
/etc/init.d/mysql startInicie o cliente MySQL
mysqlCrie e use o banco de dados
create database sonar ;
use sonar;Conceder privilégios ao usuário
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;Restaure o arquivo de backup (executando o script SQL)
source / tmp / sonar . sqlSaia do MySQL Client
exitPare o MySQL Server
/etc/init.d/mysql stopAgora você restaurou com sucesso o banco de dados na nova versão do MySQL. Os dados do banco de dados são armazenados em path_to_persist_db do seu host.
O processo de atualização do servidor Sonarqube é automatizado, você não tem nada para alterar manualmente no banco de dados Sonarqube.
Caminho de migração : [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
Guia de atualização de Sonarqube (apenas para referência, siga as etapas abaixo.)
Não tente parar o servidor Sonarqube, se você matar o processo, o contêiner Sonarqube sai imediatamente. Portanto, você não pode realmente atualizar o sonarqube manualmente dentro de seu recipiente. Não se preocupe, tente abaixo as etapas.
Passos:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ;Para uma grande atualização do Sonarqube, também requer atualização de banco de dados, mas isso acontece automaticamente.
Depois que o novo contêiner Sonarqube está em alta, abra sua página da web, você será redirecionado para uma página de manutenção;
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 modeAbra http: // [your_sonarqube_url]: 9000/Setup ;
Clique no botão de atualização .
A atualização do banco de dados pode levar vários minutos. Quando a migração do banco de dados terminar com sucesso, a página exibirá "banco de dados está atualizado" e o redireciona para a página inicial.
Copyright (c) 2016-2019 Jing Li. Sonarondocker é liberado sob a licença pública geral da GNU, versão 3.0. Consulte o arquivo de licença para obter detalhes.