web-dev-qa-db-ja.com

Jenkins:エージェントで実行されるステージ(別のDockerコンテナー)からDockerコンテナーに接続する

各ステージで Dockerイメージを使用する ができるように、宣言的パイプラインアプローチを使用するようにパイプラインを再構築している最中です。

現時点では、Dockerコンテナで実行されるDBに接続する統合テストを実行する次の作業コードがあります。

_node {
    // checkout, build, test stages...
    stage('Integration Tests') {            
        docker.image('mongo:3.4').withRun(' -p 27017:27017') { c ->
        sh "./gradlew integrationTest"
    }
}
_

宣言型パイプラインを使用すると、同じコードは次のようになります。

_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"
                    }
                }
            }
        }
    }
}
_

問題:ステージがDockerコンテナ内で実行され、docker.image()を実行すると、ステージで_docker: not found_エラーが発生します(現在使用されているopenjdkイメージ内のdockerを探しています。

質問:DBコンテナを起動し、宣言型パイプラインのステージからそれに接続するにはどうすればよいですか?

4
Sasha Shpota

同様の問題がありました。既製のMaven Dockerイメージを使用してビルドを実行したい一方で、アプリケーションを含むDockerイメージをビルドできるようにしたかったのです。まず、ビルドを実行するMavenコンテナーを起動して、ホストのDockerエンドポイントにアクセスできるようにしました。
部分的な例:

docker run -v /var/run/docker.sock:/var/run/docker.sock maven:3.6.1-jdk-11

次に、ビルドコンテナー内で、Dockerバイナリをダウンロードし、Dockerホストを設定します。

export DOCKER_Host=unix:///var/run/docker.sock
wget -nv https://download.docker.com/linux/static/stable/x86_64/docker-19.03.2.tgz
tar -xvzf docker-*.tgz
cp docker/docker /usr/local/bin

これで、build-container内でdockerコマンドを実行できます。私としては、ビルドの1つのステップでコンテナー内にビルドされたDockerイメージはすべてホストで保持されるため、ビルドの1つのステップでビルドされたすべてのDockerイメージは、コンテナーで実行されている後続のステップで使用できます。

0
Ivan Krizsan