I am using a Jenkins pipeline to build a Dockerfile.
The dockerfile successfully goes through all steps, and creates the docker image.
As shown:
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
However, after this, the shell Fails with the following error:
java.io.IOException: Cannot retrieve .Id from 'docker inspect base AS final'
Why does it throw this error despite the docker image successfully built? When I execute this on my local machine, the command exits on "Successfully tagged myapp:latest"
My docker version is 18.03.1-ce.
Any help on this issue would be greatly appreciated!
Docker Jenkins build file Maven does not need to be installed on the same machine that hosts Jenkins. Only Docker is needed. And finally, if any artifacts are created, the Jenkins Docker build places these in the workspace in the local file system so they persist after the container is taken offline.
Pipeline is designed to easily use Docker images as the execution environment for a single Stage or the entire Pipeline. Meaning that a user can define the tools required for their Pipeline, without having to manually configure agents. Practically any tool which can be packaged in a Docker container.
Manage Jenkins → Manage Plugins In Jenkins you have to add a new credential with your Docker Hub account details. Go to Credentials → Global → Add credentials and fill out the form with your username and password. Create your 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
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:
docker pull openjdk:8
before building--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)docker.build
and just sh "docker build --target=BUILD .
At the moment I'm not sure which one I'll go with
I ran into this same problem with Docker 18.09, but I wasn't using a multi stage build. In my case, I was getting:
java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'
The first step in my Dockerfile was:
FROM centos:7
I was able to fix the problem with docker pull centos:7
; after that, the Jenkins build was able to complete successfully.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With