Jenkins CI与docker-compose-如何正确停止容器

时间:2019-03-24 08:06:01

标签: docker-compose jenkins-pipeline

我正在尝试将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字符串-mysqlselenium容器将继续工作。

如果不使用所有容器,停止它们的最佳方法是什么? 构建完成后,我需要停止所有容器(例如mysqlselenium)。

1 个答案:

答案 0 :(得分:0)

我不明白您想在Jenkinsfile中实现什么。

1)什么时候启动容器mysqlselenium? 命令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_appmy_project_1_mysqlmy_project_1_selenium

然后,版本2将创建:my_project_2_my_appmy_project_2_mysqlmy_project_2_selenium

然后,在版本2的容器仍在运行的同时,版本1将删除my_project_1_my_appmy_project_1_mysqlmy_project_1_selenium

最后,版本2将删除:my_project_2_my_appmy_project_2_mysqlmy_project_2_selenium