【问题标题】:Is It possible to use a container as a service in Jenkins Pipeline?是否可以在 Jenkins Pipeline 中使用容器作为服务?
【发布时间】:2019-07-01 17:35:32
【问题描述】:

是否可以启动一个容器以供 jenkins 管道阶段使用?例如,启动一个 mongodb 并在配置了 docker maven 代理的阶段中使用它。

【问题讨论】:

  • 您是否在询问是否可以在特定阶段启动新容器?就像在您的示例中一样,您的舞台在 docker maven 代理上运行,但您想启动一个带有 mongodb 的容器?
  • @gavsyuk 是的。请注意,我不需要 dind,我只想启动一个开放端口的 mongo 容器,供我的 maven 代理使用。

标签: docker jenkins containers


【解决方案1】:

绝对可以从 Jenkins 作业运行 Docker,而 Jenkins 作业当前位于容器内。

您要确保避免的一件事是进入 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 命令来启动另一个具有您想要的所有属性的容器。

【讨论】:

  • 问题是调用 docker run 的 sh 命令或使用 Jenkins 的 docker api 的脚本部分失败,因为它在代理部分指定的容器内执行(在我的示例中,一个 maven容器)。正如您所提到的,我正在寻找一种将这个容器作为兄弟姐妹旋转的方法,但是我不能在我已经定义了要使用的容器的阶段内做到这一点。每次我进入阶段部分时都安装客户端对我来说似乎不太好......并且 Docker API 尝试从容器中找到 docker 命令。
  • 会不会因为你的maven容器上没有安装Docker而失败?
  • 是的,正是因为这个。
【解决方案2】:

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

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 守护进程被重用,启动容器的名称应该与某个作业标识变量或其他某种唯一的信息相关联,以避免容器名称冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2019-07-09
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多