Дженкинс CI с docker-compose - как правильно остановить контейнеры - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь использовать docker-compose с Jenkins CI.

Основная проблема для меня сейчас - как остановить все контейнеры Docker после завершения сборки?В то же время мы должны помнить, что другие контейнеры могут использовать одни и те же контейнеры.

Вот пример:

docker-compose:

version: "3"
services:
  my_app:
    build: .
    depends_on:
      - mysql
      - selenium

  mysql:
    ...

  selenium:
    ...

Jenkinsfile:

sh 'docker-compose -f docker-compose.yml build'

sh 'docker-compose -f docker-compose.yml run --rm my_app sh -c "some-commands'

stage('Run Checks') {
  parallel(
    'Tests': { sh 'docker-compose -f docker-compose.yml run --rm my_app sh -c "some command"' },

    'Scan': { sh 'docker-compose -f docker-compose.yml run --rm my_app sh -c "some command"' },

    'Some other things': { sh 'docker-compose -f docker-compose.yml run --rm my_app sh -c "some command"' }
  )
}

sh 'docker-compose -f docker-compose.yml down'

Работает как отдельная сборка.Но если я запускаю две или более сборок одновременно - первая завершенная сборка выполнит docker-compose -f docker-compose.yml down, а все остальные выполняющиеся сборки потерпят неудачу.

Если я удалю docker-compose -f docker-compose.yml down строку из Jenkinsfile - mysql и *Контейнеры 1018 * будут продолжать работать.

Каков наилучший способ остановить все контейнеры, если они не используются?Мне нужно остановить все контейнеры (mysql и selenium для этого примера) после завершения сборки.

1 Ответ

0 голосов
/ 25 марта 2019

Я не понимаю, чего вы хотите достичь в вашем Jenkinsfile.

1) Когда вы запускаете контейнеры mysql и selenium? Команда sh 'docker-compose -f docker-compose.yml run --rm my_app sh -c "some command"' запустит только службу my_app, выполнит «некоторую команду» и удалит контейнер.

2) Вам действительно нужно запустить 3 разных контейнера по my_app для «Тестов», «Сканирования» и «Некоторых других вещей»? Если вам просто нужно выполнить "some command" параллельно, попробуйте использовать команду docker-compose exec.

Если ваша основная проблема заключается в запуске / остановке контейнеров при одновременном запуске нескольких сборок, вот файл Jenkinsfile, который может помочь:

//Build the services
sh 'docker-compose -f docker-compose.yml build'

//Create and start the containers
sh 'docker-compose -f docker-compose.yml -p my_project_${BUILD_NUMBER} up -d'

stage('Run Checks') {
  parallel(
     //Execute "some command" on running container my_app
    'Tests': { sh 'docker-compose -f docker-compose.yml -p my_project_${BUILD_NUMBER} exec my_app sh -c "some command"' },

    'Scan': { sh 'docker-compose -f docker-compose.yml -p my_project_${BUILD_NUMBER} exec my_app sh -c "some command"' },

    'Some other things': { sh 'docker-compose -f docker-compose.yml -p my_project_${BUILD_NUMBER} exec my_app sh -c "some command"' }
  )
}

//Stop and remove containers
sh 'docker-compose -f docker-compose.yml -p my_project_${BUILD_NUMBER} down'

Опция -p my_project_${BUILD_NUMBER} в командах docker-compose позволит вам (и, следовательно, Jenkins) различать контейнеры, запускаемые различными сборками.

Например, сборка # 1 создаст: my_project_1_my_app, my_project_1_mysql и my_project_1_selenium.

Затем сборка # 2 создаст: my_project_2_my_app, my_project_2_mysql и my_project_2_selenium.

Затем сборка # 1 удалит: my_project_1_my_app, my_project_1_mysql и my_project_1_selenium, в то время как контейнеры сборки # 2 все еще работают.

И, наконец, сборка # 2 удалит: my_project_2_my_app, my_project_2_mysql и my_project_2_selenium.

...