Jenkins使用NFS PV执行Docker Build时挂起报错的问题求助
问题
在minikube 1.28.0上运行Jenkins 2.387.2 Pod,采用WinNFSd 2.4.0提供的NFS持久化卷(PV),日常克隆GitHub仓库等操作正常,但执行以下Docker构建命令时会挂起3-4分钟,随后抛出错误:
docker build . -t localhost/myapp:1.0.1 --build-arg HOSTNAME=my.ingress.host
错误信息:
[Pipeline] sh docker build . -t localhost/myapp:1.0.1 --build-arg HOSTNAME=my.ingress.host ERROR: input/output error groovy.lang.MissingPropertyException: No such property: exc for class: groovy.lang.Binding at groovy.lang.Binding.getVariable(Binding.java:63) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:285) at org.kohsuke.groovy.sandbox.impl.Checker$7.call(Checker.java:375) at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:379) at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:355) at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29) at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20) at WorkflowScript.run(WorkflowScript:117) at ___cps.transform___(Native Method)
使用标准PVC(非NFS)时,该Docker构建命令可正常执行。
排查与解决思路
排查NFS挂载的IO兼容性与性能
Docker构建会频繁读写上下文文件,WinNFSd可能在处理文件锁、硬链接等操作时存在兼容性问题,或挂载参数未优化导致IO阻塞:- 在Jenkins Pod中查看NFS挂载参数:执行
mount | grep nfs,确认是否使用了nfsvers=3(WinNFSd对NFSv4支持可能不稳定),若为v4可修改PV的挂载参数为nfsvers=3重试。 - 测试NFS挂载目录的读写性能:执行
dd if=/dev/zero of=/var/jenkins_home/test_io bs=1M count=100和dd if=/var/jenkins_home/test_io of=/dev/null bs=1M count=100,观察是否有明显延迟或IO错误。 - 检查WinNFSd的共享权限:确保共享目录的权限允许Jenkins Pod的运行用户(通常为UID 1000的jenkins用户)读写,避免因权限不足导致的IO阻塞。
- 在Jenkins Pod中查看NFS挂载参数:执行
优化Docker构建上下文
若构建上下文包含大量文件/大文件,通过NFS读取会大幅拖慢构建速度甚至超时:- 使用
.dockerignore排除无关文件(如node_modules、日志、临时文件),缩小构建上下文体积。 - 在流水线中将构建上下文临时复制到Pod的本地磁盘(如/tmp目录,非NFS挂载路径),再执行构建:
sh 'cp -r . /tmp/build_context' dir('/tmp/build_context') { sh 'docker build . -t localhost/myapp:1.0.1 --build-arg HOSTNAME=my.ingress.host' }
验证是否还会出现挂起或IO错误,以此区分是NFS问题还是Docker本身的问题。
- 使用
检查WinNFSd的日志与版本问题
- 启用WinNFSd的日志功能,查看Docker构建执行期间是否有报错或异常输出,定位具体的NFS请求失败原因。
- WinNFSd 2.4.0存在已知的稳定性问题,可尝试升级到最新版本,或更换其他NFS服务器(如基于Linux的NFS服务)对比测试。
修复Jenkins流水线的错误处理逻辑
错误信息中的MissingPropertyException是Groovy脚本的问题,根源是流水线错误处理代码引用了不存在的exc变量,导致原始IO错误被掩盖:
检查流水线中第117行附近的错误处理逻辑,将exc替换为正确的异常变量名(如error或exception),这样能获取更准确的Docker构建失败信息,便于排查根源问题。对比本地存储的行为差异
标准PVC使用本地存储无问题,说明Docker构建本身逻辑正常,可进一步在NFS挂载目录执行大量文件操作(如解压大压缩包),验证是否会出现IO错误,确认问题是否与NFS存储的特性直接相关。
内容的提问来源于stack exchange,提问作者iperezmel78
相关产品推荐
相关产品推荐

