web-dev-qa-db-ja.com

Jenkinsパイプラインを使用してDockerイメージを構築するときに「Dockerから.Idを取得できません」を解決する方法

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です。

この問題に関するヘルプは大歓迎です!

19
fuzzi

そのJenkinsプラグインにはバグがあるようです。

マルチステージビルド名( "AS final "不要な場合):

FROM base
(....)

ただし、以前にビルドしたイメージ(マルチステージ)を本当に参照する必要がある場合は、回避策として--copy-from 0(別名ではなく、対応する0,1,2)

ジェンキンスの関連問題


編集

OPが見つけたソリューションをここに文書化します。

Jenkinsfileパイプラインファイルを使用せず、代わりにJenkinsジョブ内でシェルを実行してDockerビルドコマンドを実行することで、これが機能するようになりました。 (docker build -t latest-build。)

19
Robert

_--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_が利用できないためです。

私にはたくさんの回避策があります:

  1. ビルドする前に_docker pull openjdk:8_を実行して、とにかく画像が利用できることを確認してください
  2. _--target=BUILD_を_docker.build_コマンドから削除して、全体をビルドできるようにします(ビルドが最も高価な部分なので、あまり大したことではありません)
  3. _docker.build_の使用を避け、_sh "docker build --target=BUILD ._のみを使用してください

現時点では、どちらに行くかわからない

2
Steve Mason

Docker 18.09でも同じ問題に遭遇しましたが、マルチステージビルドを使用していませんでした。私の場合、私は次のものを得ていました:

Java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'

Dockerfileの最初のステップは次のとおりです。

FROM centos:7

docker pull centos:7;で問題を修正できました。その後、Jenkinsビルドは正常に完了することができました。

1
Andrew Schlei

私の特定の状況では、ジェンキンにはマスターとスレーブの2つのノードがありました。ジョブがスレーブノードで実行されたとき、ジョブは失敗しました。マスターノードで実行すると、ジョブは正常に実行されます。

Jenkinsfileを使用して特定のノードでjenkinsジョブを実行するにはどうすればよいですか?例:

node('master') {}
0
Janderson Silva