使用docker-java调loadImageCmd报java.lang.RuntimeException: java.net.SocketException: 你的主机中的软件中止了一个已建立的连接
·
以下内容为本人遇到的问题,仅作参考。
错误原因
在安装了docker desktop的Windows系统下,通过docker导出来的镜像文件不兼容Linux。个人猜测是docker在wls环境下运行,导出到Windows是适配windows,再导入的时候实际是导到了linux下。
通过实际测试,使用Linux下的docker导出镜像后再重新加载是没有问题的。
报错环境
docker环境:Windows下的docker desktop
Java依赖:
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-httpclient5</artifactId>
<version>3.5.3</version>
</dependency>
报错堆栈
java.lang.RuntimeException: java.net.SocketException: 你的主机中的软件中止了一个已建立的连接。
at com.github.dockerjava.httpclient5.ApacheDockerHttpClientImpl.execute(ApacheDockerHttpClientImpl.java:193)
at com.github.dockerjava.httpclient5.ApacheDockerHttpClient.execute(ApacheDockerHttpClient.java:9)
at com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:228)
at com.github.dockerjava.core.DefaultInvocationBuilder.postStream(DefaultInvocationBuilder.java:193)
at com.github.dockerjava.core.exec.LoadImageCmdExec.execute(LoadImageCmdExec.java:24)
at com.github.dockerjava.core.exec.LoadImageCmdExec.execute(LoadImageCmdExec.java:10)
at com.github.dockerjava.core.exec.AbstrSyncDockerCmdExec.exec(AbstrSyncDockerCmdExec.java:21)
at com.github.dockerjava.core.command.AbstrDockerCmd.exec(AbstrDockerCmd.java:33)
报错复现
以下操作均在本地环境完成仅做测试使用。
- 通过 docker-compose build 构建镜像,
docker-compse build - 构建完成后再导出为tar文件,
docker save my-flask-app-web:latest > my-flask-app-web-latest.tar - 将导出后的tar文件通过docker-java包进行loadImageCmd()的时候报错,具体代码如下:
public void loadImage(Path tempFile) throws IOException {
try (FileInputStream fileInputStream = new FileInputStream(tempFile.toFile())) {
LoadImageCmd loadImageCmd = client.loadImageCmd(fileInputStream);
// ResultCallback.Adapter<LoadResponseItem> callback = new ResultCallback.Adapter<>() {
// @Override
// public void onComplete() {
// System.out.println("Image loaded successfully");
// }
//
// @Override
// public void onError(Throwable throwable) {
//// throwable.printStackTrace();
//
// System.err.println("Error loading image: " + throwable.getMessage());
// }
//
// @Override
// public void onNext(LoadResponseItem item) {
// if (item.getStream() != null) {
// System.out.print(item.getStream());
// }
// }
// };
// loadImageCmd.exec().awaitCompletion(10, TimeUnit.MINUTES);
loadImageCmd.exec();
} catch (Exception e) {
throw new IOException("Error loading image: " + e.getMessage());
}
}
- 最后通过排除原因是tar文件的问题,在本地运行
docker load -i my-flask-app-web-latest.tar重新导入到docker中时报错archive/tar: invalid tar header
更多推荐


所有评论(0)