Я не понимаю, чего вы хотите достичь в вашем 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
.