K8S集群中Jenkins使用Docker agent挂载宿主机卷报错问题咨询
问题解答
1. 如何正确配置Docker agent实现宿主机目录到容器内的卷挂载
你遇到的报错本质是Docker out of Docker(DooD)场景下的路径映射不匹配:你的Jenkins本身运行在K8S容器内,挂载了宿主机的docker sock,所以Jenkins调用docker创建的所有agent容器都直接运行在宿主机上,而非Jenkins容器内部。Jenkins默认不知道自身容器内的/var/jenkins_home对应宿主机的/var/openebs/local/pvc-17af5382-33cf-431f-b077-9bc136fef2db路径,会直接把自身容器内的工作目录路径传给docker run的挂载参数,宿主机上不存在对应路径就会报目录不存在错误。
正确配置可选择以下任意方案:
- 方案1:全局配置路径映射(推荐)
进入Jenkins系统管理→系统配置→找到Docker Plugin的设置项,添加路径映射规则:/var/jenkins_home=/var/openebs/local/pvc-17af5382-33cf-431f-b077-9bc136fef2db,保存后Jenkins生成docker run命令时会自动替换路径,不需要改Jenkinsfile。 - 方案2:单pipeline适配
调整Jenkinsfile的docker agent配置,避免和默认挂载逻辑冲突,示例如下:pipeline { agent { docker { image 'ubuntu:20.04' args '--rm -t -u root -v /var/openebs/local/pvc-17af5382-33cf-431f-b077-9bc136fef2db:/var/jenkins_home' // 禁用默认工作目录自动挂载 skipDefaultCheckout true } } stages { stage('Load Container') { steps { // 手动创建Jenkins需要的临时目录 sh 'mkdir -p /var/jenkins_home/workspace/dataService_cicd@tmp' sh 'echo "Hello"' sh 'python3 --version' } } } }
2. 为什么Jenkins会自动挂载上述额外的卷
这是Jenkins Docker插件的默认设计,自动挂载的两个目录作用分别为:
/var/jenkins_home/workspace/[任务名]:任务的工作目录,用于存储拉取的代码、构建产物、任务配置文件,实现Jenkins主进程和agent容器的文件共享,保证上下游步骤操作的是同一份数据。/var/jenkins_home/workspace/[任务名]@tmp:Jenkins专用的临时目录,用于存储sh命令的执行日志、返回结果、中间缓存文件,Jenkins需要读取这个目录下的内容才能捕获命令输出、判断命令执行状态。
末尾的rw,z是挂载权限参数,rw表示授予读写权限,z是SELinux标签标记,用于解决宿主机开启SELinux时的访问权限问题。
内容的提问来源于stack exchange,提问作者ThaiLB
相关产品推荐
相关产品推荐

