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

如何在Kubernetes集群部署的Jenkins Pod节点中运行Docker?

在Kubernetes Jenkins Agent Pod中运行Docker(用于Testcontainers)

可以在Jenkins Agent Pod中运行Docker来支持Testcontainers,但你之前尝试的宿主机Socket挂载方案需要适配Kubernetes环境,以下是可行的解决方案及问题排查:

问题原因

你遇到的Cannot connect to the Docker daemon at unix:///var/run/docker.sock错误,通常是以下原因:

  • Pod未正确挂载宿主机的Docker Socket
  • 容器内的Jenkins用户没有访问Socket的权限
  • 宿主机Docker daemon未运行(K8s节点一般默认运行,但需确认)

可行方案

1. 挂载宿主机Docker Socket到Agent Pod(推荐,资源高效)

该方案让Agent Pod直接使用宿主机的Docker daemon,无需在Pod内启动独立的Docker服务:

  • Pod YAML配置示例:
apiVersion: v1
kind: Pod
metadata:
  name: jenkins-agent-docker
spec:
  containers:
  - name: jenkins-agent
    image: your-custom-jenkins-agent  # 需预先安装docker客户端
    command: ["sleep", "infinity"]
    volumeMounts:
    - name: docker-sock
      mountPath: /var/run/docker.sock
    securityContext:
      supplementalGroups: [999]  # 替换为宿主机docker组的GID,可通过节点上`getent group docker`查询
  volumes:
  - name: docker-sock
    hostPath:
      path: /var/run/docker.sock
      type: Socket
  • 注意事项:
    • 确保Agent镜像中已安装Docker客户端(Ubuntu用apt install docker.io,Alpine用apk add docker-cli)
    • 宿主机的Docker组GID必须与Pod中supplementalGroups一致,否则Jenkins用户无权限访问Socket
    • 此方案存在安全风险:所有Agent共享宿主机Docker,恶意Agent可能操作宿主机资源

2. 在Agent Pod中运行独立Docker Daemon(DinD,隔离性好)

通过Sidecar容器在Pod内启动独立的Docker daemon,适合需要隔离Docker环境的场景:

  • Pod YAML配置示例:
apiVersion: v1
kind: Pod
metadata:
  name: jenkins-agent-dind
spec:
  containers:
  - name: jenkins-agent
    image: your-custom-jenkins-agent
    command: ["sleep", "infinity"]
    env:
    - name: DOCKER_HOST
      value: tcp://localhost:2375  # 连接Sidecar的Docker daemon
  - name: docker-dind
    image: docker:dind
    privileged: true  # DinD必须启用特权模式
    volumeMounts:
    - name: docker-storage
      mountPath: /var/lib/docker
  volumes:
  - name: docker-storage
    emptyDir:
      medium: Memory  # 用tmpfs提升性能,避免磁盘IO瓶颈
  • 注意事项:
    • 特权模式存在安全风险,需严格控制Agent Pod的权限
    • 内存介质的emptyDir会在Pod销毁时丢失数据,适合临时测试场景

3. 使用Testcontainers Kubernetes模块(原生K8s方案)

Testcontainers提供了Kubernetes专属模块,无需依赖Docker daemon,直接在K8s集群中创建测试Pod:

  • 核心思路:
    引入Testcontainers Kubernetes依赖后,通过KubernetesContainer API直接调度测试容器到K8s集群,完全适配原生环境,避免Docker相关问题
  • 优势:
    无需特权模式、无需Docker客户端/daemon,符合K8s最佳实践,隔离性强

快速排查步骤

  1. 进入Agent Pod,检查Socket挂载是否成功:ls -l /var/run/docker.sock
  2. 检查Jenkins用户是否属于docker组:id jenkins
  3. 手动测试连接:docker -H unix:///var/run/docker.sock ps

内容的提问来源于stack exchange,提问作者CodeGrinder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:28:25