在本地Jenkins多分支管道中找不到Docker命令

时间:2018-06-18 20:07:02

标签: docker jenkins jenkins-pipeline

我有 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看起来很奇怪,并且还配置了全局工具配置部分,其中包含如下所示的相应详细信息。我查看了几个帖子,到目前为止没有一个解决方案。

Global Tool Configuration

9 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,由于有了这个线程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 :(得分:0)

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

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

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

示例截图如下。

Setup docker installer path in jenkins under Global Tool Configuration

答案 2 :(得分:0)

我能够通过全局工具配置部分检索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'
        }
}

答案 3 :(得分:0)

自动化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。

应对可执行文件后,构建按预期工作。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我在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命令机器。

package main

import (
    "fmt"
    "golang.org/x/sys/windows"
)

func main() {
    handle := windows.CurrentProcess()
    var isWow64 bool
    err := windows.IsWow64Process(handle, &isWow64)
    if err != nil {
        panic(err)
    }
    fmt.Println(isWow64)
}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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