Windows下使用com.github.docker-java操作Docker遇协议不支持错误求助
解决Windows下docker-java 3.3.0版本npipe协议不支持的问题
问题原因
Windows系统中Docker Desktop默认使用npipe:////./pipe/docker_engine套接字与客户端通信,但你当前使用的docker-java 3.3.0版本默认依赖的Jersey HTTP客户端不支持npipe协议,因此抛出Unsupported protocol scheme异常。而Linux系统使用Unix套接字,默认客户端原生支持,所以代码可以正常运行。
解决方案
步骤1:添加npipe传输依赖
在pom.xml中补充docker-java-transport-npipe依赖,该包专门处理Windows下的npipe协议通信:
<dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java</artifactId> <version>3.3.0</version> </dependency> <!-- 添加npipe传输依赖 --> <dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java-transport-npipe</artifactId> <version>3.3.0</version> </dependency>
步骤2:修改DockerClient构建代码
显式使用npipe专用的HTTP客户端构建DockerClient,替换原来的默认构建方式:
import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.npipe.NpipeDockerHttpClient; public static void main(String[] args) { String containerName = "mycontainer_name"; String dockerImage = "myimage"; // 配置Docker客户端参数 DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() .withDockerHost("npipe:////./pipe/docker_engine") .build(); // 使用npipe HTTP客户端构建DockerClient DockerClient dockerClient = DockerClientBuilder.getInstance(config) .withDockerHttpClient(new NpipeDockerHttpClient.Builder() .dockerHost(config.getDockerHost()) .build()) .build(); // 后续容器操作逻辑保持不变 if (dockerContainerExists(containerName, dockerClient)) { System.out.println("Container already exists"); dockerStop(containerName, dockerClient); DockerRm(containerName, dockerClient); } CreateContainerCmd createContainer = dockerClient .createContainerCmd(dockerImage).withName(containerName); createContainer.withTty(true); createContainer.exec(); dockerClient.killContainerCmd(containerName).exec(); dockerClient.removeContainerCmd(containerName).exec(); }
备选方案:改用TCP协议(仅开发环境临时使用)
如果你不想添加额外依赖,可以在Docker Desktop设置中开启Expose daemon on tcp://localhost:2375 without TLS,然后修改DockerClient的主机地址为TCP格式:
DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() .withDockerHost("tcp://localhost:2375") .build();
注意:该方式关闭了TLS加密,存在安全风险,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者SanjiSqurt
相关产品推荐
相关产品推荐

