Mac M1环境Jenkins Docker Agent无法执行sh命令问题咨询
故障环境
- 运行设备:Mac M1
- 环境配置:基于
jenkins:2.355构建Docker镜像,安装Docker Pipeline 1.28插件
问题现象
运行如下Docker Agent类型流水线时:
pipeline { agent { docker { image 'node:16.13.1-alpine' } } stages { stage('build') { steps { sh 'node --version' } } } }
Docker Agent镜像可正常拉取,但sh命令始终未执行,任务卡住数秒后自动终止。
获取到的控制台运行日志如下:
Started by user Miguel Salinas Gancedo [Pipeline] Start of Pipeline [Pipeline] node (hide) Running on Jenkins in /var/jenkins_home/workspace/docker-demo [Pipeline] { [Pipeline] isUnix [Pipeline] withEnv [Pipeline] { [Pipeline] sh + docker inspect -f . node:16.13.1-alpine . [Pipeline] } [Pipeline] // withEnv [Pipeline] withDockerContainer Jenkins does not seem to be running inside a container $ docker run -t -d -u 0:0 -w /var/jenkins_home/workspace/docker-demo -v /var/jenkins_home/workspace/docker-demo:/var/jenkins_home/workspace/docker-demo:rw,z -v /var/jenkins_home/workspace/docker-demo@tmp:/var/jenkins_home/workspace/docker-demo@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** node:16.13.1-alpine cat $ docker top 71f7d4d760e80490e325446e445050b46558b45e0ca4c3a99ef9ac8b65e2666d -eo pid,comm [Pipeline] { [Pipeline] stage [Pipeline] { (build) [Pipeline] sh process apparently never started in /var/jenkins_home/workspace/docker-demo@tmp/durable-f28a3e4d (running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer) [Pipeline] } [Pipeline] // stage [Pipeline] } $ docker stop --time=1 71f7d4d760e80490e325446e445050b46558b45e0ca4c3a99ef9ac8b65e2666d $ docker rm -f 71f7d4d760e80490e325446e445050b46558b45e0ca4c3a99ef9ac8b65e2666d [Pipeline] // withDockerContainer [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code -2 Finished: FAILURE
故障原因
该故障是ARM架构(M1系列芯片)Mac环境下Docker Desktop与低版本Jenkins插件的兼容问题,触发逻辑如下:
- 当前使用的Jenkins 2.355版本内置的Durable Task插件版本较低,Docker Pipeline启动Agent容器时,默认会把待执行的shell脚本写入工作区挂载的
@tmp目录,再进入容器执行该脚本。 - ARM架构Mac版Docker Desktop默认的文件共享挂载规则,会给宿主机挂载到容器的目录加上
noexec限制,同时插件默认给docker run添加的-t(伪终端分配)参数在该环境下存在进程启动兼容bug,两个问题叠加导致容器内无法执行挂载目录下的shell脚本,最终抛出process apparently never started错误,任务以-2退出码终止。
修复方案
按优先级从高到低选择以下方案即可解决问题:
- 方案1:升级相关插件
进入Jenkins插件管理页面,将Docker Pipeline、Durable Task两个插件升级到最新稳定版,高版本已经修复了ARM架构Mac环境下的伪终端兼容、挂载目录执行权限判定问题,升级后重启Jenkins即可正常运行流水线。 - 方案2:调整Jenkins启动JVM参数
如果暂时无法升级插件,可以修改Jenkins启动命令中的JVM参数,添加如下配置:
第一个参数开启shell启动的详细诊断日志,方便后续排查同类问题;第二个参数启用插件内置的二进制包装器启动shell进程,绕过挂载目录脚本执行和伪终端的兼容问题。-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.USE_BINARY_WRAPPER=true - 方案3:调整流水线Agent配置
直接修改流水线的Docker Agent配置,显式添加运行参数,将工作目录挂载为容器内可执行的tmpfs文件系统,规避宿主机挂载目录的权限限制,修改后的流水线示例:pipeline { agent { docker { image 'node:16.13.1-alpine' args '--tmpfs /var/jenkins_home/workspace:rw,exec -u 0:0' } } stages { stage('build') { steps { sh 'node --version' } } } } - 方案4:调整Docker Desktop配置
打开Mac端Docker Desktop的设置页,找到开发特性配置项,将文件共享实现从VirtioFS切换为gRPC-FUSE,重启Docker Desktop后即可解决挂载目录默认带noexec限制导致的脚本无法执行问题。
内容的提问来源于stack exchange,提问作者Miguel Angel Salinas Gancedo
相关产品推荐
相关产品推荐

