在Jenkins Pipeline中可以将容器用作服务吗?

时间:2019-07-01 17:35:32

标签: docker jenkins containers

是否可以启动一个詹金斯管道阶段要使用的容器?例如,启动m​​ongodb并在配置了docker maven代理的阶段中使用它。

2 个答案:

答案 0 :(得分:0)

当Jenkins作业当前位于容器内部时,绝对有可能从Jenkins作业运行Docker。

要确保避免的一件事是进入Docker-in-Docker情况,即您的容器将创建子容器。相反,您希望当前的容器创建一个“兄弟”容器。

如果您看以下博客文章(由docker-in-docker的创建者撰写):

https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

在底部有一个“解决方案”部分,内容涉及如何使您的舞台容器访问主机的Docker引擎。然后,可以访问Docker引擎,您应该能够编写一个简单的Shell Docker命令来启动另一个具有所需所有属性的容器。

答案 1 :(得分:0)

我发现这样做的唯一方法是在准备阶段启动容器,以将其用作其他阶段的服务,然后在发布部分中杀死它们:

pipeline {
    agent any

    stages {

        stage('Prepare Mongo') {
            steps {
                script {
                    sh 'docker run --rm -d --name mongo mongo:<version>'
                }
            }
        }

        // Other stages, some using the mongo service.
    }

    post {
        always {
            sh 'docker stop mongo'
        }
    }
}

由于docker守护进程已被重用,因此启动的容器的名称应与某些作业标识变量或其他唯一的信息相关联,以免容器名称冲突。