我正在尝试将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
,而所有其他正在运行的构建都将失败。
如果我从Jenkinsfile中删除docker-compose -f docker-compose.yml down
字符串-mysql
和selenium
容器将继续工作。
如果不使用所有容器,停止它们的最佳方法是什么?
构建完成后,我需要停止所有容器(例如mysql
和selenium
)。
答案 0 :(得分:0)
我不明白您想在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
。
然后,在版本2的容器仍在运行的同时,版本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
。