Jenkins Agent Cannot run program "docker": error=2, No such file or directory

12k Views Asked by At

I have a strange behaviour with my jenkins agent. i have a master and a seperate build agent, which has access to docker.

while i'm running the following pipeline script on the build agent:

node {
    sh "id"
    sh "echo $PATH"
    sh "docker ps"
    docker.image("node:latest").inside("") {
        sh "npm --version"
    }
}

i get the following output:

Running on docker-agent in /home/jenkins/workspace/test
[Pipeline] {
[Pipeline] sh
[test] Running shell script
+ id
uid=1000(jenkins) gid=1000(jenkins) groups=900(docker),1000(jenkins),1000(jenkins)
[Pipeline] sh
[test] Running shell script
+ echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[Pipeline] sh
[test] Running shell script
+ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[Pipeline] sh
[test] Running shell script
+ docker inspect -f . node:latest
.
[Pipeline] withDockerContainer
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to docker-agent
        at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1741)
        at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:357)
        at hudson.remoting.Channel.call(Channel.java:955)
        at hudson.Launcher$RemoteLauncher.launch(Launcher.java:1058)
        at hudson.Launcher$ProcStarter.start(Launcher.java:454)
        at org.jenkinsci.plugins.docker.workflow.client.DockerClient.launch(DockerClient.java:296)
        at org.jenkinsci.plugins.docker.workflow.client.DockerClient.launch(DockerClient.java:277)
        at org.jenkinsci.plugins.docker.workflow.client.DockerClient.launch(DockerClient.java:274)
        at org.jenkinsci.plugins.docker.workflow.client.DockerClient.version(DockerClient.java:246)
        at org.jenkinsci.plugins.docker.workflow.WithContainerStep$Execution.start(WithContainerStep.java:141)
        at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:270)
        at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:180)
        at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
        at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
        at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
        at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82)
        at sun.reflect.GeneratedMethodAccessor94.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
        at com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:46)
        at com.cloudbees.groovy.cps.Next.step(Next.java:83)
        at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
        at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
        at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
        at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
        at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
        at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
        at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
        at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
        at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
Caused: java.io.IOException: Cannot run program "docker": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at hudson.Proc$LocalProc.<init>(Proc.java:249)
    at hudson.Proc$LocalProc.<init>(Proc.java:218)
    at hudson.Launcher$LocalLauncher.launch(Launcher.java:935)
    at hudson.Launcher$ProcStarter.start(Launcher.java:454)
    at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:1312)
    at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:1265)
    at hudson.remoting.UserRequest.perform(UserRequest.java:212)
    at hudson.remoting.UserRequest.perform(UserRequest.java:54)
    at hudson.remoting.Request$2.run(Request.java:369)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

The output shows, that docker ps works fine, when i'm running it as a shell. When i'm running it with the docker build step, it leads to the given exception.

Any ideas what i'm doing wrong?

4

There are 4 best solutions below

1
On BEST ANSWER

Docker plugin launches docker from java and does not use environment variables from settings. I solved the problem adding PATH to jenkins-lts.plist and restart Jenkins

    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
2
On

Solved the problem. It had two issues.

First i've set the PATH for the build agent, which was working fine with the shell commands, but the pipeline didn't work with it. While docker was located in /usr/local/bin the pipeline couldn't find it. It only knows /usr/bin:/usr/sbin.

Second i removed the PATH environment variable in the jenkins build agent configuration and created a symbolic link in /usr/bin for docker.

Now my pipelines works.

0
On

I finally solved this problem by adding export PATH="$PATH:/usr/local/bin"; to Prefix Start Agent Command.

Open Manage Jenkins -> Manage Nodes and Clouds -> -> Configure -> Click Advanced under Launch method -> Add export PATH="$PATH:/usr/local/bin"; to Prefix Start Agent Command. enter image description here

enter image description here

Then re-launch the Jenkins, it should work fine.

1
On

Did you already try this like they say in https://jenkins.io/doc/book/pipeline/docker/ ?

you need c -> as in:

node {
    sh "id"
    sh "echo $PATH"
    sh "docker ps"
    docker.image("node:latest").inside("") { c ->
        sh "npm --version"
    }
}

Another example: https://github.com/jenkinsci/pipeline-examples/pull/83/files