Jenkins:从与代理(另一个 Docker 容器)一起运行的阶段连接到 Docker 容器

Sas*_*ota 8 jenkins docker jenkins-pipeline jenkins-declarative-pipeline

我正在重新设计管道以使用声明式管道方法,以便我能够在每个阶段使用 Docker 映像

目前我有以下工作代码,它执行连接到在 Docker 容器中运行的数据库的集成测试。

node {
    // checkout, build, test stages...
    stage('Integration Tests') {            
        docker.image('mongo:3.4').withRun(' -p 27017:27017') { c ->
        sh "./gradlew integrationTest"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用声明式管道,相同的代码看起来像这样:

pipeline {
    agent none
    stages {
        // checkout, build, test stages...
        stage('Integration Test') {
            agent { docker { image 'openjdk:11.0.4-jdk-stretch' } }
            steps {
                script {
                    docker.image('mongo:3.4').withRun(' -p 27017:27017') { c ->
                        sh "./gradlew integrationTest"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:该阶段现在在 Docker 容器中运行docker.image(),并且运行会导致docker: not found该阶段出错(它正在openjdk现在使用的图像中寻找 docker )。

问题:如何启动一个数据库容器并从声明性管道的一个阶段连接到它?

Mos*_*ein 1

因此,如果我正确理解,您的测试需要两件事:

  • Java环境
  • 数据库连接

在这种情况下,您是否尝试过不同的方法,例如Docker In Docker (DIND)

如果您可以拥有用作docker:dind基础映像并包含您的 java 环境的自定义映像,并在本agent节中使用它,那么管道的其余步骤将能够按照您的预期使用 docker 命令。