【问题标题】:Run docker build inside Jenkins Docker Slave在 Jenkins Docker Slave 中运行 docker build
【发布时间】:2021-07-13 00:43:37
【问题描述】:

目前我有一个包含以下阶段的 CI 管道:

  1. 构建
  2. 单元测试
  3. 静态代码分析

这就是我的 Jenkinsfile 的样子:

pipeline {
  agent any

  stages {
    stage("Install") {
      steps {
        sh "npm install"
      }
    }
    stage("Build") {
      steps {
        sh "npm run build"
      }
    }
    stage("Format") {
        steps {
            sh "npm run format"
        }
    }
    stage("Lint") {
      steps {
        sh "npm run lint"
      }
    }
    stage("Test") {
      steps {
        sh "npm run test"
      }
    }
    stage("Code Coverage") {
      steps {
        sh "npm run test:cov"
        publishHTML(target: [
            reportDir: "./coverage/lcov-report",
            reportFiles: "index.html",
            reportName: "Jest Coverage Report"
        ])
      }
    }
    stage("End-To-End Testing") {
      steps {
        sh "npm run test:e2e"
      }
    }
  }
}

我想向我的管道添加更多阶段:

  1. 从 Dockerfile 构建和标记 Docker 映像
  2. 将镜像推送到 Docker Hub
  3. 需要 Docker CLI 的更多步骤

例子:

pipeline {
  .
  .
  .
  stage("Docker Build") {
    steps {
      sh "docker build -t [user_name]/[image_name]:[tag] .
    }
  }
}

我对此很陌生,我尝试了多种安装 docker 的方法,但都不成功,这也是一种不好的做法。

我们可以运行docker run -v /var/run/docker.sock:/var/run/docker.sock ...,但是在使用 docker build 命令时我不能使用绑定挂载。

有人可以建议我在 Jenkins SSH 代理中使用 docker 命令的方法吗?

【问题讨论】:

    标签: docker jenkins continuous-integration devops


    【解决方案1】:

    解决方案

    1. 在 Jenkins Docker Slave 中安装没有守护程序的 Docker CLI。我已经使用了这个Docker Agent 并使用这个method 在其中安装了Docker CLI
    2. 然后,作为 docker 守护进程,我使用了我的远程 docker 主机。 (此外,您可以使用这些steps 将本地 docker 主机配置为远程主机)。您可以使用 --host 标志使用 docker 远程主机。例如。 docker --host x.x.x.x:2375 build -t johndoe:calculator .
    3. 语法:docker --host [Docker_Host]:[Port] build -t [Image_Name]:[Image_Tag] .

    我新建的 Jenkinsfile 如下:

    pipeline {
      agent any
    
      stages {
        stage("Install") {
          steps {
            sh "npm install"
          }
        }
        stage("Build") {
          steps {
            sh "npm run build"
          }
        }
        stage("Format") {
            steps {
                sh "npm run format"
            }
        }
        stage("Lint") {
          steps {
            sh "npm run lint"
          }
        }
        stage("Test") {
          steps {
            sh "npm run test"
          }
        }
        stage("Code Coverage") {
          steps {
            sh "npm run test:cov"
            publishHTML(target: [
                reportDir: "./coverage/lcov-report",
                reportFiles: "index.html",
                reportName: "Jest Coverage Report"
            ])
          }
        }
        stage("End-To-End Testing") {
          steps {
            sh "npm run test:e2e"
          }
        }
        stage("Docker Build") {
          steps {
            withCredentials([string(credentialsId: 'Docker_Host', variable: 'DOCKER_HOST')]) {
              sh 'docker --host $DOCKER_HOST build -t xxx/xxx .'
            }
          }
        }
      }
    }
    

    注意:我已将 Jenkins 上的 Docker 主机 URL 作为凭据存储并使用 withCredentials 函数使用它。

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 2016-11-25
      • 1970-01-01
      • 2015-10-06
      • 2023-03-03
      • 2018-05-20
      • 1970-01-01
      • 2017-09-17
      • 2020-01-12
      相关资源
      最近更新 更多