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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:50:05