You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:57:04