如何在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
相关产品推荐
相关产品推荐

