以下内容为本人遇到的问题,仅作参考。

错误原因

在安装了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)

报错复现

以下操作均在本地环境完成仅做测试使用。

  1. 通过 docker-compose build 构建镜像, docker-compse build
  2. 构建完成后再导出为tar文件,docker save my-flask-app-web:latest > my-flask-app-web-latest.tar
  3. 将导出后的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());
        }
    }
  1. 最后通过排除原因是tar文件的问题,在本地运行docker load -i my-flask-app-web-latest.tar 重新导入到docker中时报错archive/tar: invalid tar header
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐