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

如何在Kubernetes Pod内通过Jenkins运行依赖Docker的TestContainers测试

解决方案

1. 修复Pod模板配置(pod.yaml)

原Pod模板存在缩进错误(volumeMounts未关联到docker-daemon容器),同时需要配置docker-daemon暴露Docker服务端口、开启特权模式,并给maven容器添加连接Docker服务的环境变量:

apiVersion: v1
kind: Pod 
metadata:  
  labels: 
    some-label: jenkins-build-agent-maven 
spec:  
  containers:  
  - name: maven  
    image: docker.artifactory.serv.cdc.fr/maven-ci:3.8.4-jdk-17  
    imagePullPolicy: Always  
    env:
    - name: DOCKER_HOST
      value: tcp://docker-daemon:2375
    - name: DOCKER_TLS_CERTDIR
      value: "" # 禁用TLS简化配置
  - name: docker-daemon  
    image: docker.artifactory.serv.cdc.fr/docker:20.10.17-dind  
    imagePullPolicy: Always  
    securityContext:
      privileged: true # dind容器必须开启特权模式才能正常运行
    ports:
    - containerPort: 2375 # 暴露Docker服务TCP端口供maven容器访问
    volumeMounts:  
    - name: docker-socket  
      mountPath: /var/run
  volumes:
  - name: docker-socket
    emptyDir: {}
  - name: docker-storage
    emptyDir:
      medium: Memory # 用内存存储提升dind性能(可选)

2. 调整Jenkinsfile(仅需少量验证)

原Jenkinsfile结构无需大幅修改,只需确保在maven容器内执行测试时能访问到Docker服务,可添加验证步骤:

pipeline {
  agent {
    kubernetes {
      yaml libraryResource('podTemplates/pod.yaml')
    }
  }

  stages {
    stage('Checkout from VCS') {
      steps {
        checkoutScm()
      }
    }

    stage('Integration Testing') {
      steps {
        container('maven') {
          sh 'docker info' # 验证Docker连接是否正常
          sh 'mvn test'    # 执行TestContainers集成测试
        }
      }
    }
  }
}

核心说明

  • Pod内容器通信:Kubernetes Pod中的所有容器共享同一网络命名空间,maven容器可通过容器名docker-daemon直接访问其暴露的2375端口。
  • TestContainers适配:TestContainers会自动读取DOCKER_HOST环境变量,使用指定的Docker守护进程运行测试容器。
  • Dind特权要求:docker-in-docker容器需要特权模式才能创建自身的Docker守护进程,否则会因权限不足启动失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:47:32