Docker 의 DB와 함께 Sonarqube를 실행하기위한 완전한 가이드.
Compose로 Docker를 조정하는 것은 쉽지만 실제로는 몇 가지 함정이 있습니다. 전체 이야기에 대해 배우거나, 그냥 실행하고 싶다면 시작하기 시작 하십시오.
Compose를 통해 Sonarqube 및 데이터베이스 컨테이너를 함께 실행할 때 다음과 같은 오류가 발생할 수 있습니다.
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').데이터베이스 초기화 프로세스는 특히 영구 데이터베이스가 없을 때 Sonarqube의 부팅 시간보다 약간 더 오래 걸리기 때문입니다.
그렇다면 데이터베이스 연결의 준비 상태를 감지하는 방법은 무엇입니까?
실패한 것 :
depends_on 옵션 : docker-compose.yml 파일 에서이 옵션을 지정하여 종속성 순서로 서비스를 시작할 수 있지만 종속 서비스가 준비되기까지 기다리지는 않습니다.
대기 스크립트 : Compose Article에서 Docker의 스타트 업 시작 순서에 권장되는 대기중인 스크립트는 데이터베이스 포트의 가용성을 확인하고 대기 할 수 있습니다. 불행히도 이것은 도움이되지 않습니다. 그 이유는 데이터베이스 컨테이너가 시작된 직후 포트를 사용할 수 있기 때문입니다. 그러나 데이터베이스 연결이 준비되었음을 의미하지는 않습니다. nc -v -n -z -w1 $HOST $PORT 잊어 버리십시오.
HEALTHCHECK Instruction :이 새로운 기능은 버전 1.12 이후 Dockerfiles에서 사용할 수 있지만 아직 Docker-Compose에는 그렇지 않습니다 (현재는). 사용법 : HEALTHCHECK [OPTIONS] CMD command . 이것은 유망한 것처럼 들리지만 Docker에게 무엇을 확인 해야하는지 말해야하는 명령을 스스로 작성해야합니다.
데이터베이스 명령 : 데이터베이스 가용성을 확인하려면 mysql -e "select 1" 을 실행하는 것은 어떻습니까? 그렇습니다 - 그러나 잠깐만 기다려주세요 - Sonarqube 컨테이너에는 MySQL 클라이언트가 설치되어 있지 않으며 공식 Sonarqube Docker 이미지를 제어 할 수 없습니다.
웹 서버 : 또 다른 해킹 - 데이터베이스 상태에 응답하는 MySQL 컨테이너에서 최소 (1 라이너) 웹 서버를 설정하면 어떻게해야합니까? 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" 및 volumes: ./data/mysql:/var/log/mysql data/mysql:/var/log/mysql을 추가하여 호스트 디렉토리에 MySQL 로그를 지속 할 수 있습니다. 그런 다음 볼륨을 장착하여 Sonarqube 컨테이너와 공유하여 사용할 수 있습니다. 그러나 우리는 실제로 두 서비스 측면에 command 과 volumes 구성을 추가하고 싶습니까?
더 나은 방법이 있어야합니다…
작동 한 것 :
Sonarqube V7.9부터 더 이상 MySQL을 지원하지 않습니다. 자세한 내용은 MySQL 지원의 End of Life를 방문하십시오. 결과적으로 MySQL을 언급 한 아래의 단락에 대해서는 무시하십시오. 여전히 Sonarqube v7.7 (또는 이전 버전)과 함께 MySQL을 사용하고 싶지 않다면.
데이터베이스의 준비 상태를 확인하기 위해 전체 프로젝트, 특히 Detector.java 를 복제해야합니다.
Sonarqube 및 Database (예 : MySQL 또는 PostgreSQL )에 대한 Docker Images의 원하는 버전을 가져옵니다.
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]헤드 업 : 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 the 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.sqlMySQL Docker 컨테이너 시작 (MySQL의 새 버전)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashMySQL 서버를 시작하십시오
/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 Server 업그레이드 프로세스는 자동화되며 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 modehttp : // [your_sonarqube_url] : 9000/setup ;
업그레이드 버튼을 클릭하십시오.
데이터베이스 업그레이드는 몇 분이 걸릴 수 있습니다. DB 마이그레이션이 성공적으로 종료되면 페이지에 "데이터베이스가 최신입니다"를 표시 한 다음 홈페이지로 리디렉션됩니다.
저작권 (C) 2016-2019 Jing Li. Sonarondocker 는 GNU Lesser General Public License, 버전 3.0에 따라 릴리스됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.