GKE containerd节点Testcontainers报Docker缺失异常解决方法
GKE 1.24 containerd节点池Jenkins动态代理Testcontainers适配方案
问题现象
- GKE升级Kubernetes 1.24版本后,默认运行时切换为containerd,正式移除dockershim支持
- 集群内Jenkins通过Kubernetes插件动态创建Pod代理,原有配置通过挂载宿主机docker.sock、docker二进制的方式提供Docker访问能力
- 代理切换到containerd节点后,Testcontainers启动失败,抛出
DockerNotPresentException异常,提示Docker不存在
异常日志如下:
java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dockerPresenceMarker' defined in class path resource [com/playtika/test/common/spring/DockerPresenceBootstrapConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.playtika.test.common.spring.DockerPresenceMarker]: Factory method 'dockerPresenceMarker' threw exception; nested exception is com.playtika.test.common.spring.DockerNotPresentException: Docker must be present in order for testcontainers to work properly!
配置调整步骤
1. 更新Jenkins代理Pod的卷挂载配置
删除原有所有Docker相关的HostPath挂载项(包括/var/run/docker.sock、宿主机docker二进制路径等),新增以下containerd相关的HostPath挂载:
- 宿主机路径
/run/containerd/containerd.sock挂载到容器内同路径,类型为Socket - 宿主机路径
/var/lib/containerd挂载到容器内同路径,类型为Directory - 宿主机路径
/sys/fs/cgroup挂载到容器内同路径,类型为Directory,挂载传播设置为Bidirectional
2. 添加必要的环境变量
在代理Pod的容器配置中添加以下环境变量,指定Testcontainers对接containerd socket:
DOCKER_HOST=unix:///run/containerd/containerd.sock TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/run/containerd/containerd.sock TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED=true
前置要求:Testcontainers版本必须升级到1.17.0及以上,低版本不兼容containerd runtime。
3. 配置Pod安全上下文
给代理容器配置特权权限,保证可以正常调用containerd接口创建嵌套容器:
securityContext: privileged: true runAsUser: 0
4. 功能验证
代理Pod启动后直接运行测试任务即可,Testcontainers会通过containerd socket自动拉取镜像、创建测试容器,不会再抛出Docker不存在的异常。
内容的提问来源于stack exchange,提问作者codependent
相关产品推荐
相关产品推荐

