Table of Contents
There are times when you need to build docker images inside Jenkins. Well, actually that is a common practice nowadays. However, without setting up the docker client properly, you might now be able to do so.
When running Jenkins without docker client, you may encounter errors like this:
java.io.IOException: error=2, No such file or directory at java.base/java.lang.ProcessImpl.forkAndExec(Native Method) at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340) at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107) Caused: java.io.IOException: Cannot run program "docker": error=2, No such file or directory at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) at hudson.Proc$LocalProc.<init>(Proc.java:254) at hudson.Proc$LocalProc.<init>(Proc.java:223) at hudson.Launcher$LocalLauncher.launch(Launcher.java:997) at hudson.Launcher$ProcStarter.start(Launcher.java:509) at hudson.Launcher$ProcStarter.join(Launcher.java:520) at org.jenkinsci.plugins.docker.commons.impl.RegistryKeyMaterialFactory.materialize(RegistryKeyMaterialFactory.java:101) at org.jenkinsci.plugins.docker.workflow.AbstractEndpointStepExecution2.doStart(AbstractEndpointStepExecution2.java:53) at org.jenkinsci.plugins.workflow.steps.GeneralNonBlockingStepExecution.lambda$run$0(GeneralNonBlockingStepExecution.java:77) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)
This post’s only purpose is to help you setup a docker client correctly inside a Jenkins container so you can start building your images right away.
Just a quick note to save you time, don’t mount the docker binary from the host to the container. It doesn’t work. At least that was my experience.
You would possibly encounter errors like this:
docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by docker) docker: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by docker)
Step 1: Download the Docker client
There is a dedicated page to download the Docker client. Since I’m using Jenkins lts and it’s running Debian, I can get all versions here:
https://download.docker.com/linux/static/stable/x86_64/
Choose your version and copy the link.
Step 2: Install Docker client for Jenkins container
Now, with the link, exec into Jenkins container:
docker exec -it jenkins bash
Next, use wget to download the docker binary. If you don’t have wget
installed, simply run:
apt update && apt install wget
And download the archive file:
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz
Then extract it:
tar -xf docker-20.10.9.tgz
Now, it will extract a folder called docker
. However, you just need one binary file named docker
inside that folder.
The last step is to move that file to /usr/local/bin
(Create this folder if it doesn’t exist)
mv ./docker/docker /usr/local/bin
Now Jenkins can build docker images without problems:
Conclusion
With a few very simple steps, you can now build docker images inside Jenkins.
I build softwares that solve problems. I also love writing/documenting things I learn/want to learn.
Can you show me the way in case of use docker window, plz. Tks