Имеется 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]
Готово.




