各ステージで 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コンテナを起動し、宣言型パイプラインのステージからそれに接続するにはどうすればよいですか?
同様の問題がありました。既製の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イメージは、コンテナーで実行されている後続のステップで使用できます。