Jenkinsパイプラインを使用してDockerfileを構築しています。
Dockerfileはすべてのステップを正常に実行し、Dockerイメージを作成します。
示されているように:
Step 16/19 : FROM base AS final
---> <id>
Step 17/19 : WORKDIR /app
---> Using cache
---> <id>
Step 18/19 : COPY --from=publish /app .
---> Using cache
---> <id>
Step 19/19 : ENTRYPOINT ["", "myapp.dll"]
---> Using cache
---> <id>
Successfully built cb3y81938e88
Successfully tagged myapp:latest
ただし、この後、シェルは次のエラーで失敗します。
Java.io.IOException: Cannot retrieve .Id from 'docker inspect base AS final'
Dockerイメージが正常に構築されたにもかかわらず、なぜこのエラーがスローされるのですか?ローカルマシンでこれを実行すると、コマンドは「Successfully tagged myapp:latest」で終了します
私のdockerバージョンは18.03.1-ceです。
この問題に関するヘルプは大歓迎です!
そのJenkinsプラグインにはバグがあるようです。
マルチステージビルド名( "AS final
"不要な場合):
FROM base
(....)
ただし、以前にビルドしたイメージ(マルチステージ)を本当に参照する必要がある場合は、回避策として--copy-from 0
(別名ではなく、対応する0,1,2)
ジェンキンスの関連問題
編集
OPが見つけたソリューションをここに文書化します。
Jenkinsfileパイプラインファイルを使用せず、代わりにJenkinsジョブ内でシェルを実行してDockerビルドコマンドを実行することで、これが機能するようになりました。 (docker build -t latest-build。)
_--target=<foo>
_を使用して特定のポイントまでしかイメージを構築していないため、この問題が発生しています。
したがって、私のDockerfileは次のようになります
_FROM maven:3.6-jdk-8 AS BUILD
.. do build ..
FROM openjdk:8
COPY --from=BUILD /myapp/bin my_jar_file
_
そして、docker.build(<tag>, "--target=BUILD .")
を使用したビルドは次のように失敗します。
_Java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'
_
これは、JenkinsがDockerfileの2番目の_FROM openjdk:8
_を検査しようとしていることと、そのターゲットがDockerを実行しなかったため、そのイメージがプルダウンされず、_docker inspect
_が利用できないためです。
私にはたくさんの回避策があります:
docker pull openjdk:8
_を実行して、とにかく画像が利用できることを確認してください--target=BUILD
_を_docker.build
_コマンドから削除して、全体をビルドできるようにします(ビルドが最も高価な部分なので、あまり大したことではありません)docker.build
_の使用を避け、_sh "docker build --target=BUILD .
_のみを使用してください現時点では、どちらに行くかわからない
Docker 18.09でも同じ問題に遭遇しましたが、マルチステージビルドを使用していませんでした。私の場合、私は次のものを得ていました:
Java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'
Dockerfileの最初のステップは次のとおりです。
FROM centos:7
docker pull centos:7
;で問題を修正できました。その後、Jenkinsビルドは正常に完了することができました。
私の特定の状況では、ジェンキンにはマスターとスレーブの2つのノードがありました。ジョブがスレーブノードで実行されたとき、ジョブは失敗しました。マスターノードで実行すると、ジョブは正常に実行されます。
Jenkinsfileを使用して特定のノードでjenkinsジョブを実行するにはどうすればよいですか?例:
node('master') {}