Имеется Docker Compose стек с Jenkins, SonarQube и PostgresSQL, см. пост SonarQube: запуск в Docker и вызов из Jenkins Pipeline.
Проблема в том, что они описаны в одном Compose-файле, и весь стек перезапускается единым systemd-файлом (см. Linux: systemd сервис для Docker Compose).
Соответственно, если надо перезапустить SonarQube — то придётся перезапускать и Jenkins, на котором постоянно запущены билды.
Задача — разделить их на два Compose-файла, но при этом оставить возможность коммуникации между сервисами по именам контейнеров, что бы не перепиливать настройки.
Решеине — использовать общую сеть через external
.
Версия Compose — 3.5.
Содержание
Jenkins network
В Compose-файле Jenkins добавляем name
— создаём custom network с именем jenkins:
version: '3.5' networks: jenkins: name: jenkins services: jenkins: user: root image: jenkins/jenkins:2.176.2 networks: - jenkins ports: - '8080:8080' - '50000:50000' environment: - JENKINS_HOME=/var/lib/jenkins - JAVA_OPTS=-Duser.timezone=Europe/Kiev - JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' 'unsafe-inline' data:;\"" logging: driver: "journald"
Иначе Docker создаст сеть с именем имясервиса_имясети, хочется большей определённости.
SonarQube network
А в Compose-файле SonarQube и PostgresSQL — создаём сеть sonar как external сети jenkins:
version: '3.5' networks: sonar: external: name: jenkins services: sonarqube: user: 1004:1004 image: sonarqube:7.9.1-community ports: - "9000:9000" networks: - sonar environment: - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar volumes: - /data/sonarqube/conf:/opt/sonarqube/conf - /data/sonarqube/logs:/opt/sonarqube/logs - /data/sonarqube/temp:/opt/sonarqube/temp - /data/sonarqube/data:/opt/sonarqube/data - /data/sonarqube/extensions:/opt/sonarqube/extensions - /data/sonarqube/bundled_plugins:/opt/sonarqube/lib/bundled-plugins logging: driver: "journald" db: image: postgres networks: - sonar environment: - POSTGRES_USER=sonar - POSTGRES_PASSWORD=sonar volumes: - /data/sonarqube/postgresql:/var/lib/postgresql - /data/sonarqube/postgresql_data:/var/lib/postgresql/data logging: driver: "journald"
Проверяем сети:
[simterm]
root@jenkins-production:/opt/jenkins# docker network ls NETWORK ID NAME DRIVER SCOPE ... fb22545d1fae jenkins bridge local ...
[/simterm]
Проверяем контейнеры, использующие эту сеть:
[simterm]
root@jenkins-production:/opt/jenkins# docker network inspect jenkins | jq '.[] | .Containers[].Name' "jenkins_db_1" "jenkins_sonarqube_1" "jenkins_jenkins_1"
[/simterm]
И проверяем подключение, используя имя сервиса из SonarQube Compose — sonarqube:
[simterm]
root@jenkins-production:/opt/jenkins# docker exec -ti jenkins_jenkins_1 curl -I sonarqube:9000 HTTP/1.1 200
[/simterm]
Или db:
[simterm]
root@jenkins-production:/opt/jenkins# docker exec -ti jenkins_jenkins_1 telnet db 5432 Trying 172.20.0.3... Connected to db. Escape character is '^]'.
[/simterm]
Готово.