如何在Jenkins流水线中正确传递Docker Run参数?
问题描述
我尝试使用particle/buildpack-particle-firmware镜像搭建Jenkins流水线,本地执行以下docker run命令可正常运行:
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 } }
错误信息:
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.
已知该镜像对应的Dockerfile,查阅Jenkins+Docker文档未找到该类镜像的使用方法,请问如何解决该问题,正确调用带Run参数的Docker容器?
解决方法
你的Jenkins Docker Agent配置存在两个核心问题:
args参数重复指定了镜像名:Jenkins的docker agent会自动处理镜像启动,args只需要传入额外参数(如挂载、环境变量),不需要重复写镜像名,否则会被当成启动命令执行,导致错误。- 挂载路径的上下文问题:Jenkins流水线中,
application是工作目录的相对路径,需要用绝对路径或Jenkins内置环境变量映射。
修正方案一:调整Docker Agent配置
stage('build firmware') { agent { docker { image 'particle/buildpack-particle-firmware:4.0.2-tracker' args "-v ${env.WORKSPACE}:/input -v ${env.WORKSPACE}:/output -e PLATFORM_ID=26" } } steps { archiveArtifacts artifacts: 'target/*.bin', fingerprint: true, onlyIfSuccessful: true } }
关键调整点:
- 移除
args中的镜像名,只保留挂载和环境变量参数 - 使用
${env.WORKSPACE}获取Jenkins当前工作目录的绝对路径,确保挂载路径正确 - 调整
archiveArtifacts路径,容器内输出目录/output对应Jenkins工作目录,直接写target/*.bin即可
修正方案二:直接在Steps中执行docker run命令
若该镜像设计为一次性执行构建任务就退出,可直接用docker run命令替代Docker Agent,更贴近本地执行逻辑:
stage('build firmware') { agent any steps { sh """ docker run --rm \ -v ${env.WORKSPACE}:/input \ -v ${env.WORKSPACE}:/output \ -e PLATFORM_ID=26 \ particle/buildpack-particle-firmware:4.0.2-tracker """ archiveArtifacts artifacts: 'target/*.bin', fingerprint: true, onlyIfSuccessful: true } }
内容的提问来源于stack exchange,提问作者extraj
相关产品推荐
相关产品推荐

