Docker-in-Docker环境下Testcontainer连接Ryuk失败的解决方法
解决Docker-in-Docker环境下Testcontainers无法连接Ryuk的方案
1. 升级Testcontainers版本
你当前使用的1.21.0版本较旧(对应Ryuk v0.11.0),版本间存在DinD环境的兼容性问题。建议升级到1.19.0及以上稳定版本(如1.29.1),新版本优化了Ryuk的网络适配逻辑,能更好处理DinD场景。
修改Maven依赖:
<dependency> <groupId>org.testcontainers</groupId> <artifactId>postgresql</artifactId> <version>1.29.1</version> <scope>test</scope> </dependency>
2. 调整环境变量配置
- 移除
TESTCONTAINERS_HOST_OVERRIDE=172.17.0.3,该变量在DinD环境下会导致端口映射逻辑混乱,Testcontainers可自动识别Docker守护进程地址。 - 添加
DOCKER_HOST=tcp://docker:2375(若Docker Compose中DinD服务名为docker),让测试容器正确连接到DinD的Docker守护进程。 - 确保
TESTCONTAINERS_RYUK_DISABLED=false(默认启用,若之前手动禁用需恢复),保证Ryuk正常启动。
3. 统一Docker Compose网络配置
将测试服务与DinD服务放入同一自定义网络,避免默认bridge网络的端口访问限制:
services: test-service: build: . volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DOCKER_HOST=tcp://docker:2375 networks: - test-net docker: image: docker:dind privileged: true networks: - test-net networks: test-net: driver: bridge
4. 修正Ryuk端口映射逻辑
错误日志显示尝试连接172.17.0.3:59197,而你观测到的8080是Ryuk的管理端口,Testcontainers会随机映射宿主机端口用于通信。在DinD环境下:
- 不要手动指定Ryuk端口,让Testcontainers自动处理端口映射。
- 若必须固定端口,可设置
TESTCONTAINERS_RYUK_PORT=59197匹配错误日志中的端口,但优先推荐自动分配。
5. 检查权限与容器配置
- 确保测试容器内
/var/run/docker.sock有读写权限,可在Dockerfile中添加RUN chmod 666 /var/run/docker.sock。 - DinD容器必须开启
privileged: true,否则无法正常启动Docker守护进程及Ryuk容器。
内容的提问来源于stack exchange,提问作者Akash Jain
相关产品推荐
相关产品推荐

