How to resolve "Cannot retrieve .Id from docker" when building Docker image using Jenkins pipeline

It seems that there is a bug in that Jenkins plugin.

You can try removing multi stage build name ("AS final" as you don't need it):

FROM base
(....)

But if you really need to reference a previous built image (multi stage), a workaround can be using --copy-from 0 (0,1,2 as it corresponds, instead of the alias name)

Related issues in Jenkins

  • https://issues.jenkins-ci.org/browse/JENKINS-44789
  • https://issues.jenkins-ci.org/browse/JENKINS-44609
  • https://issues.jenkins-ci.org/browse/JENKINS-31507

Edit

Documenting here the solution found by the OP:

I got this working by not using the Jenkinsfile pipeline file, but instead executing a Shell within the Jenkins job to execute the Docker build command. (docker build -t latest-build .)


I'm getting this problem because I'm using --target=<foo> to build my image only up to a certain point.

So my Dockerfile looks like this

FROM maven:3.6-jdk-8 AS BUILD

.. do build ..

FROM openjdk:8

COPY --from=BUILD /myapp/bin my_jar_file

And my build with docker.build(<tag>, "--target=BUILD .") fails with:

java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'

This is because Jenkins is trying to inspect the second FROM openjdk:8 in the Dockerfile, and because that target didn't run Docker didn't pull down that image and it's unavailable to docker inspect

I've got a bunch of workarounds available to me:

  1. Ensure that image is available anyway by running docker pull openjdk:8 before building
  2. Remove --target=BUILD from my docker.build command and let it build the whole thing (not too big a deal for me as the build is the most expensive part)
  3. Avoid using docker.build and just sh "docker build --target=BUILD .

At the moment I'm not sure which one I'll go with