85

export我了解(对于容器)和save(对于图像)之间的区别。但是在一天结束时,保存或导出生成的压缩包应该用作图像

那么为什么有 2 个命令可以从 tarball 制作图像呢?

4

3 回答 3

117

docker save确实会生成一个 tarball,包含所有父层和所有标签 + 版本。

docker export也会产生一个 tarball,但没有任何层/历史。

它通常在想要“展平”图像时使用,如Thomas Uhrig的“展平 Docker 容器或图像”中所示:

docker export <CONTAINER ID> | docker import - some-image-name:latest

但是,一旦生成了这些 tarball,加载/导入就可以:

  • docker import一个甚至不是图像的tarball创建一个图像(只是您要作为图像导入的文件系统)

创建一个空的文件系统映像并导入 tarball 的内容

  • docker load从 tarred 存储库创建可能的多个docker save图像(因为可以将多个图像保存在 tarball 中)。

从文件或标准输入流加载 tarred 存储库

于 2016-04-29T07:47:15.293 回答
20

作为一个 Docker 新手,我很难学到这种差异。

  • 在一个系统上:

    docker run -it myImage /bin/bash
    

    --> 工作正常

  • 在同一系统上(使用save):

    docker save myImage -o myImage.tar
    
  • 在第二个系统上(使用import):

    docker import myImage.tar
    

    --> 效果很好,没有问题,只需要标记:

    docker tag _the_assigned_tag myImage
    
  • 在第二个系统上:

    docker run -it myImage /bin/bash
    

    docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:345:启动容器进程导致“exec:\”/bin/bash\“:stat /bin/bash:没有这样的文件或目录”:未知

寻找那个错误给我带来了各种各样的原因,例如MountFlags="slave",但真正的原因竟然是这篇文章中描述的:我应该使用 load 而不是 import。不知道发生了什么,Docker 的错误消息并没有让我在任何意义上走上“导入”原因的轨道,直到我偶然发现了这篇文章。

于 2019-07-23T12:22:41.327 回答
2

docker import主要用于从正在运行的容器创建的 tarball。例如。docker export containerID > /home/cntr.tar然后将此 tarball 导入到图像中。码头工人进口 /home/cntr.tar mynewimage:tag

docker load用于从另一个图像创建的 tarball 加载图像。例如。docker save > /home/fromimg.tar然后用docker load < /home/fromimg.tar加载它

尽管 docker save/load with image 的主要区别确实保留了图像历史记录。而带有容器的 docker export/import 通过删除容器的所有历史来使图像变平。

于 2019-04-22T21:15:44.653 回答