Mac M1环境下Testcontainers无法创建/启动容器求助
Mac M1上Testcontainers 1.17.6创建容器时的挂载路径错误解决方法
问题描述
在Mac M1设备上使用Testcontainers 1.17.6创建GenericContainer时触发以下错误:
com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"error while creating mount source path '/Users/k/Library/Containers/com.docker.docker/Data/docker.raw.sock': mkdir /Users/k/Library/Containers/com.docker.docker/Data/docker.raw.sock: operation not supported"}
环境信息
- Docker版本:
Cloud integration: v1.0.29 Version: 20.10.21 API version: 1.41 Go version: go1.18.7 Git commit: baeda1f Built: Tue Oct 25 18:01:18 2022 OS/Arch: darwin/arm64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.21 API version: 1.41 (minimum version 1.12) Go version: go1.18.7 Git commit: 3056208 Built: Tue Oct 25 17:59:41 2022 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.6.10 GitCommit: 770bd0108c32f3fb5c73ae1264f7e503fe7b2661 runc: Version: 1.1.4 GitCommit: v1.1.4-0-g5fd4c4d docker-init: Version: 0.19.0 GitCommit: de40ad0
- Maven依赖:
<dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>1.17.6</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> <version>1.17.6</version> <scope>test</scope> </dependency>
已尝试的无效操作
- 确认目标路径存在:
k@m ~ % ls -la /Users/k/Library/Containers/com.docker.docker/Data/docker.raw.sock srwxr-xr-x@ 1 k staff 0 Apr 2 23:54 /Users/k/Library/Containers/com.docker.docker/Data/docker.raw.sock
- 在
.testcontainers.properties中禁用检查(配置已加载):
k@mbp ~ % cat .testcontainers.properties checks.disable=true
日志验证:
00:02:21.835 [main] DEBUG org.testcontainers.utility.TestcontainersConfiguration - Testcontainers configuration overrides will be loaded from file:/Users/k/.testcontainers.properties
- 重启Docker
- 尝试PostgreSQL容器,错误一致
解决方案
1. 升级Testcontainers版本(推荐)
这个问题是Testcontainers 1.17.x版本在Mac M1环境下的已知兼容性bug,核心是Docker Socket路径识别错误。升级到1.18.0及以上版本即可彻底修复。
修改Maven依赖版本:
<dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>1.18.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> <version>1.18.0</version> <scope>test</scope> </dependency>
2. 手动指定Docker Socket路径(临时 workaround)
如果暂时无法升级版本,可以通过代码或系统属性强制指定正确的Docker Socket路径:
代码中指定
GenericContainer<?> container = new GenericContainer<>("your-image:tag") .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig( new HostConfig().withBinds(new Bind("/var/run/docker.sock", new Volume("/var/run/docker.sock"))) ));
通过JVM参数指定
在测试启动的JVM参数中添加:
-Dtestcontainers.docker.socket=/var/run/docker.sock
代码中设置系统属性
System.setProperty("testcontainers.docker.socket", "/var/run/docker.sock");
3. 检查Docker Desktop文件共享配置
确保Docker Desktop已授权访问你的用户目录:
- 打开Docker Desktop偏好设置
- 进入资源 > 文件共享
- 确认
/Users或/Users/k已被勾选 - 点击应用并重启生效
内容的提问来源于stack exchange,提问作者zu5005
相关产品推荐
相关产品推荐

