如何在Jenkins中传递docker run参数?

z4iuyo4d  于 2022-12-22  发布在  Jenkins
关注(0)|答案(1)|浏览(209)

我正在尝试使用this docker image设置Jenkins管道。它需要按以下方式执行:

docker run --rm \
  -v $PROJECT_DIR:/input \
  -v $PROJECT_DIR:/output \
  -e PLATFORM_ID=$PLATFORM_ID \
  particle/buildpack-particle-firmware:$VERSION

Jenkins管道中的实现如下所示:

stage('build firmware') {
  agent { 
      docker { 
        image 'particle/buildpack-particle-firmware:4.0.2-tracker' 
        args '-v application:/input -v application:/output -e PLATFORM_ID=26 particle/buildpack-particle-firmware:4.0.2-tracker'    
      }
   }
   steps {
      archiveArtifacts artifacts: 'application/target/*.bin', fingerprint: true, onlyIfSuccessful: true
   }
}

在我的PC系统上执行这个命令效果很好。在执行Jenkins管道时,我最终得到了这个错误:

java.io.IOException: Failed to run image 'particle/buildpack-particle-firmware:4.0.2-tracker'. Error: docker: Error response from daemon: failed to create shim: OCI runtime create failed: runc create failed: unable to start container process: exec: "-w": executable file not found in $PATH: unknown.

我通读了Jenkins + Docker的文档,但我找不到如何使用这样的映像,所有的指南通常都解释如何运行docker映像和执行shell命令。
如果我没弄错的话,this Dockerfile就是上述Docker图像的布局。
如何绕过这个问题并使用run参数调用Docker容器?

ndh0cuux

ndh0cuux1#

agent模式适用于在容器内运行Jenkins构建步骤的情况;在您的示例中,运行archiveArtifacts步骤 * 而不是 * 容器通常所做的事情。您可以想象在agent { docker { image } }行中使用只包含构建工具的映像,如golang或Java映像之一,Jenkins将注入几行docker命令行选项,以便它针对工作区树运行。
Jenkins Docker接口可能没有内置的方法来等待容器完成,相反,您可以启动一个“sidecar”容器,然后从容器外部运行docker wait still来等待它完成。

stage('build firmware') {
  steps {
    docker
      .image('particle/buildpack-particle-firmware:4.0.2-tracker')
      .withRun('-v application:/input -v application:/output -e PLATFORM_ID=26 particle/buildpack-particle-firmware:4.0.2-tracker') { c ->
        sh "docker wait ${c.id}"
    }
    archiveArtifacts artifacts: 'application/target/*.bin', fingerprint: true, onlyIfSuccessful: true
  }
}

相关问题