Jenkins worker pod Docker in Docker场景下SSH_AUTH_SOCK失效问题咨询
问题根因
你当前使用的是Kubernetes Pod侧车模式的Docker in Docker(DinD)架构:
alpine容器仅安装Docker客户端,实际Docker daemon运行在同Pod的docker-daemon侧容器中- 两个容器仅通过emptyDir共享了
/var/run目录用于Docker socket通信,其他文件系统完全隔离
Jenkins sshagent插件生成的SSH代理套接字默认存储在alpine容器的独立临时路径(通常为/tmp/ssh-XXXXXX/agent.XX),这个路径对docker-daemon容器完全不可见:
当你执行docker run -v ${SSH_AUTH_SOCK}:/ssh_auth_sock时,Docker客户端会将alpine容器本地的套接字路径发送给docker-daemon,后者在自身文件系统中找不到对应路径,最终挂载到内层容器的是无效的空文件,因此抛出连接拒绝错误。
而EC2 worker节点上Docker客户端和Daemon共享主机全量文件系统,挂载路径可正常访问,因此命令可以正常执行。
解决方案
方案1:共享临时目录到Docker Daemon容器(推荐)
修改Pod模板,新增emptyDir挂载/tmp目录,让SSH代理套接字路径可以被docker-daemon访问:
apiVersion: v1 kind: Pod spec: containers: - name: alpine image: pgedara/alpine-docker:3.0 command: - cat tty: true imagePullPolicy: Always securityContext: privileged: true volumeMounts: - name: docker-socket mountPath: /var/run - name: tmp-share mountPath: /tmp - name: docker-daemon image: docker:dind securityContext: privileged: true volumeMounts: - name: docker-socket mountPath: /var/run - name: tmp-share mountPath: /tmp volumes: - name: docker-socket emptyDir: {} - name: tmp-share emptyDir: {}
修改后原有流水线命令无需调整即可正常运行。
方案2:直接传递SSH密钥到内层容器(适合临时测试)
如果不想调整Pod模板,也可以在sshagent块中将密钥直接导出到内层容器:
sshagent(['my-ssh-key']) { sh(script: ''' PRIV_KEY=$(ssh-add -L | head -n1) docker run -e PRIV_KEY="${PRIV_KEY}" pgedara/alpine-git:5.0 bash -c "echo '${PRIV_KEY}' > /root/.ssh/id_rsa && chmod 600 /root/.ssh/id_rsa && ssh-add -L" ''') }
该方案安全性低于方案1,不建议用于生产环境。
内容的提问来源于stack exchange,提问作者Ambegodas
相关产品推荐
相关产品推荐

