升级MacOS Sequoia 15后无法连接localhost:50517的Ryuk问题求助
排查Testcontainers Ryuk连接失败(Broken pipe)的思路
验证Docker Desktop网络配置
- 检查Docker Desktop的「设置 > 网络」,确认是否启用了「允许使用默认Docker套接字」,或者执行
ls -l /var/run/docker.sock查看套接字权限,确保当前用户拥有读写权限 - 尝试切换Docker Context:执行
docker context use default后重新运行mvn verify
- 检查Docker Desktop的「设置 > 网络」,确认是否启用了「允许使用默认Docker套接字」,或者执行
检查MacOS Sequoia的防火墙与隐私权限
- 打开「系统设置 > 网络 > 防火墙」,确认Docker Desktop和Homebrew安装的OpenJDK是否被允许接收传入连接
- 查看「系统设置 > 隐私与安全性 > 完全磁盘访问权限」,确保Docker Desktop、运行
mvn的终端/IDE已添加权限
调试Ryuk容器状态与端口映射
- 测试时暂停执行(如在测试代码中加断点),执行
docker inspect <Ryuk容器ID>(替换为日志中的实际容器ID,例:8ea1bb2f94ea),查看NetworkSettings.Ports中5051端口的宿主机映射情况,确认端口绑定正确 - 手动测试端口连通性:执行
nc localhost 50517(替换为日志中的实际端口),检查是否能建立连接
- 测试时暂停执行(如在测试代码中加断点),执行
调整Testcontainers依赖版本
- 当前Demo使用的Testcontainers版本可能与MacOS Sequoia存在兼容性问题,尝试升级到最新稳定版,或降级至之前能正常运行的版本(修改pom.xml中的
testcontainers-bom版本)
- 当前Demo使用的Testcontainers版本可能与MacOS Sequoia存在兼容性问题,尝试升级到最新稳定版,或降级至之前能正常运行的版本(修改pom.xml中的
临时禁用Ryuk验证
- 添加环境变量
TESTCONTAINERS_RYUK_DISABLED=true,重新运行mvn verify。若测试正常执行,说明问题聚焦在Ryuk的连接机制上,可进一步排查Ryuk相关配置
- 添加环境变量
环境信息
Java版本
java -version openjdk version "21.0.4" 2024-07-16 OpenJDK Runtime Environment Homebrew (build 21.0.4) OpenJDK 64-Bit Server VM Homebrew (build 21.0.4, mixed mode, sharing)
Docker版本
docker version Client: Version: 27.2.0 API version: 1.47 Go version: go1.21.13 Git commit: 3ab4256 Built: Tue Aug 27 14:14:45 2024 OS/Arch: darwin/arm64 Context: desktop-linux Server: Docker Desktop 4.34.2 (167172) Engine: Version: 27.2.0 API version: 1.47 (minimum version 1.24) Go version: go1.21.13 Git commit: 3ab5c7d Built: Tue Aug 27 14:15:41 2024 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.7.20 GitCommit: 8fc6bcff51318944179630522a095cc9dbf9f353 runc: Version: 1.1.13 GitCommit: v1.1.13-0-g58aa920 docker-init: Version: 0.19.0 GitCommit: de40ad0
错误日志
14:51:41.924 [main] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy - Loaded org.testcontainers.dockerclient.UnixSocketClientProviderStrategy from ~/.testcontainers.properties, will try it first 14:51:42.060 [main] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy - Found Docker environment with local Unix socket (unix:///var/run/docker.sock) 14:51:42.061 [main] INFO org.testcontainers.DockerClientFactory - Docker host IP address is localhost 14:51:42.070 [main] INFO org.testcontainers.DockerClientFactory - Connected to docker: Server Version: 27.2.0 API Version: 1.47 Operating System: Docker Desktop Total Memory: 7838 MB 14:51:42.080 [main] INFO tc.testcontainers/ryuk:0.5.1 - Creating container for image: testcontainers/ryuk:0.5.1 14:51:42.250 [main] INFO org.testcontainers.utility.RegistryAuthLocator - Credential helper/store (docker-credential-desktop) does not have credentials for https://index.docker.io/v1/ 14:51:42.302 [main] INFO tc.testcontainers/ryuk:0.5.1 - Container testcontainers/ryuk:0.5.1 is starting: 8ea1bb2f94ea72d9248e75babaf4a3e1be825deb49e66891e32896fd33cb1eb6 14:51:42.485 [main] INFO tc.testcontainers/ryuk:0.5.1 - Container testcontainers/ryuk:0.5.1 started in PT0.411918S 14:51:42.490 [testcontainers-ryuk] WARN org.testcontainers.utility.RyukResourceReaper - Can not connect to Ryuk at localhost:50517 java.net.SocketException: Broken pipe at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method) at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) at java.base/sun.nio.ch.NioSocketImpl.tryWrite(NioSocketImpl.java:394) at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:410) at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440) at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:819) at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1195) at java.base/java.io.OutputStream.write(OutputStream.java:124) at org.testcontainers.utility.ResourceReaper$FilterRegistry.register(ResourceReaper.java:389) at org.testcontainers.utility.RyukResourceReaper.lambda$null$0(RyukResourceReaper.java:109) at org.rnorth.ducttape.ratelimits.RateLimiter.doWhenReady(RateLimiter.java:27) at org.testcontainers.utility.RyukResourceReaper.lambda$maybeStart$1(RyukResourceReaper.java:88) at java.base/java.lang.Thread.run(Thread.java:1583)
内容的提问来源于stack exchange,提问作者user471011
相关产品推荐
相关产品推荐

