【问题标题】:Docker command not found in local Jenkins multi branch pipeline在本地 Jenkins 多分支管道中找不到 Docker 命令
【发布时间】:2018-11-27 17:29:42
【问题描述】:

我有 BookStore 需要通过 Jenkins 部署的 Spring Boot 项目。 Docker 安装在我的本地机器 (macOS) 和 Jenkinsfile 创建如下

pipeline 
{
     agent 
     {
         docker
          {
            image 'maven:3-alpine'
            //This exposes application through port 8081 to outside world
            args '-u root -p 8081:8081 -v /var/run/docker.sock:/var/run/docker.sock  '
         }
    } 
    stages 
     {
        stage('Build') 
         {
              steps 
              {
                sh 'mvn -B -DskipTests clean package'
              }
          }

        stage('Test') 
        {
            steps {
                //sh 'mvn test'
                sh 'echo "test"'
            }
            post {
                always {
                    //junit 'target/surefire-reports/*.xml'
                    sh 'echo "test"'
                }
            }
        }

        stage('Deliver for development')
        {
                    when {
                        branch 'development'
                    }
                    steps {
                        sh './jenkins/scripts/deliver-for-development.sh'
                        input message: 'Finished using the web site? (Click "Proceed" to continue)'
                    }
        }

        stage('Deploy for production')
        {
            when {
                branch 'production'
            }
            steps {
                sh './jenkins/scripts/deploy-for-production.sh'
                input message: 'Finished using the web site? (Click "Proceed" to continue)'
            }
        }

        stage('Deliver') {
        when {
              branch 'production'
           }
            steps {
                sh 'bash ./jenkins/deliver.sh'
            }
        }
    }

}

我在 Jenkins 中创建了多分支管道,当我尝试运行它时,出现以下错误

/Users/Shared/Jenkins/Home/workspace/BookStore_master-VPWQ32ZZPV7CVOXNI4XOB3VSGH56MTF3W34KXKZFJKOBMSGLRZQQ@tmp/durable-70dd5a81/script.sh: line 2: docker: command not found

script returned exit code 127

这对我来说看起来很奇怪,因为 docker 在本地机器上可用,并且还配置了 全局工具配置 部分,其中包含适当的详细信息,如下所示。我查看了几篇帖子,但到目前为止没有一个解决方案有效。

【问题讨论】:

    标签: docker jenkins jenkins-pipeline


    【解决方案1】:

    我在 Mac 上遇到了同样的问题,以下答案对我有帮助。

    docker: command not found ( mac mini ) only happens in jenkins shell step but work from command prompt.

    解决办法是在 /usr/local/Cellar/jenkins-lts/2.176.3/homebrew.mxcl.jenkins-lts.plist 文件中加入下面这行,这样 Jenkins 就可以从主机上找到 docker 命令机器。

    <key>EnvironmentVariables</key>
        <dict>
          <key>PATH</key>
          <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Docker.app/Contents/Resources/bin/:/Users/Kh0a/Library/Group\ Containers/group.com.docker/Applications/Docker.app/Contents/Resources/bin</string>
        </dict>

    【讨论】:

    • 这对我有用。我的 Mac (/Users//Library/Group\ Containers/group.com.docker/Applications/Docker.app/Contents/Resources/bin) 上没有您的 的最后一个元素,但我刚刚指定了其余的元素,重启了 Jenkins,docker 就从 Jenkins 开始工作了。
    【解决方案2】:

    我遇到了同样的问题,感谢这个帖子https://stackoverflow.com/a/50029962/6943587,我能够解决它。

    您需要指定 docker 标签,也就是哪些奴隶有 docker。我知道有两种方法可以做到这一点。

    (选项 1 - 首选)在 Jenkinsfile 中设置 docker 标签

    将代理设置为带有 docker slave 标签的 docker 镜像。

    // Jenkinsfile
    
    pipeline {
      // Assign to docker slave(s) label, could also be 'any'
      agent {
        label 'docker' 
      }
    
      stages {
        stage('Docker node test') {
          agent {
            docker {
              // Set both label and image
              label 'docker'
              image 'node:7-alpine'
              args '--name docker-node' // list any args
            }
          }
          steps {
            // Steps run in node:7-alpine docker container on docker slave
            sh 'node --version'
          }
        }
    
        stage('Docker maven test') {
          agent {
            docker {
              // Set both label and image
              label 'docker'
              image 'maven:3-alpine'
            }
          }
          steps {
            // Steps run in maven:3-alpine docker container on docker slave
            sh 'mvn --version'
          }
        }
      }
    } 
    

    (选项2)在配置中设置docker标签

    根据 Jenkins 文档here,在“管道模型定义”下的 Jenkins 配置中设置“docker 标签”。这只会在具有此标签的从属服务器上运行管道构建。然后你可以像这样创建你的管道......

    // Jenkinsfile
    
    pipeline {
      // "Top-level" agent is assigned to docker slaves via Jenkins pipeline configuration
      agent none
    
      stages {
        stage('Docker node test') {
          agent {
            docker {
              image 'node:7-alpine'
              args '--name docker-node' // list any args
            }
          }
          steps {
            // Steps run in node:7-alpine docker container on docker slave
            sh 'node --version'
          }
        }
        
        stage('Docker maven test') {
          agent {
            docker {
              image 'maven:3-alpine'
            }
          }
          steps {
            // Steps run in maven:3-alpine docker container on docker slave
            sh 'mvn --version'
          }
        }
      }
    }
    

    希望对你有帮助

    选项 1 优于选项 2,因为 Jenkinsfile 配置 在不依赖于 docker 代理的机器上运行 Jenkins 流水线配置,可以在 未来。

    【讨论】:

    • 我没有测试过这个。看起来像赢家
    • 如果您使用选项 1 而不在 Jenkins 配置中添加标签“docker”,您将得到“Jenkins”没有标签“docker”。编辑:不,我在添加后收到此消息事件。第一个选项对我不起作用。
    • @terreb 如果您收到该错误,听起来标签正在工作,但您的 Jenkins 实例没有任何具有 docker 标签的节点(又名机器)。您必须将 docker 标签添加到已安装 docker 的机器上,以便 Jenkins 知道在哪里运行作业。
    • @Nickofthyme,你是对的。其他人部署了 Jenkins,我发现它在 Docker 容器内运行,但 docker 主机并未暴露在容器内。
    【解决方案3】:

    由于您在全局工具配置部分选择了 自动安装 选项,Jenkins 不会在您的系统中查找 docker。

    您可以通过取消选中全局工具配置部分中 docker 的 自动安装 选项来解决此问题

    • 下载 docker 安装程序,
    • 安装它并
    • 将安装程序的路径提供给 Jenkins。

    示例截图如下。

    Setup docker installer path in jenkins under Global Tool Configuration

    【讨论】:

    • 我已经这样做了,我仍然得到docker: command not found
    • 这对我不起作用
    【解决方案4】:

    我能够通过从 全局工具配置 部分检索 Docker 和 Maven 值并将它们添加到环境 PATH 中来解决这个问题,如下所示

    更新了 Jenkinsfile

    node {
    
        stage('Initialize')
        {
            def dockerHome = tool 'MyDocker'
            def mavenHome  = tool 'MyMaven'
            env.PATH = "${dockerHome}/bin:${mavenHome}/bin:${env.PATH}"
        }
    
        stage('Checkout') 
        {
            checkout scm
        }
    
          stage('Build') 
               {
                sh 'uname -a'
                sh 'mvn -B -DskipTests clean package'  
              }
    
            stage('Test') 
            {
                //sh 'mvn test'
                sh 'ifconfig' 
            }
    
            stage('Deliver') 
              {
                    sh 'bash ./jenkins/deliver.sh'
            }
    }
    

    【讨论】:

    • 是否有不依赖于从声明式pipeline 语法切换到脚本式node 语法的解决方案?
    • 你可以 NickofThyme 回答。
    • 确认它仍然是一种魅力。谢谢@Jadda
    • 很高兴它帮助了你@ArtemSolovev
    • 不工作,用你的第一个选项更改 jenkins 文件
    【解决方案5】:

    自动 docker 安装程序似乎存在问题。我在 centos 7 上的 docker 上遇到了同样的问题。

    我从https://download.docker.com/linux/static/stable/x86_64/ 下载了 docker cli 可执行文件并将它们解压缩到主机上的 jenkins docker 卷中 (/var/lib/docker/volumes/jenkins_home/_data/docker)。然后使用 docker 容器上的 shell 从 /var/jenkins_home/docker 复制到 /usr/bin。

    处理可执行文件后,构建按预期工作。

    【讨论】:

      【解决方案6】:

      就我而言,我遇到了 docker 命令问题,因为我使用的是 jenkins-lts,它也是一个 docker。在尝试调试了一段时间后,我意识到在 docker 中引用 docker 命令可能是一个问题。我停止了 jenkins-lts 服务,下载了 jenkins.war 文件并使用 docker 命令运行了相同的管道脚本。它开始工作了。我的管道脚本有任何代理,它仍然适用于 jenkins.war 版本的 jenkins

      【讨论】:

        【解决方案7】:

        如果你在 Windows 从这里关注:- https://www.katacoda.com/courses/jenkins/build-docker-images

        【讨论】:

          【解决方案8】:

          只需使用代码编辑器在“.sh”文件中应用行分隔符 Unix 和 Mac Os :“\n”。它对我有用。

          【讨论】:

            【解决方案9】:

            在运行容器时添加-v $(which docker):/usr/bin/docker

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-26
              • 1970-01-01
              • 2021-10-29
              • 2021-02-03
              • 1970-01-01
              相关资源
              最近更新 更多