Docker中导入和加载有什么区别?

时间:2016-04-28 20:53:56

标签: docker docker-image

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

那么为什么有两个命令来从tarball制作图像呢?

3 个答案:

答案 0 :(得分:63)

docker save确实会生成一个tarball,包含所有父图层,以及所有标记+版本。

docker export也会生成tarball,但没有任何图层/历史记录。

通常在需要"flatten" an image时使用,如Flatten a Docker container or image中的“Thomas Uhrig”所示:

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

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

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

创建空文件系统映像并导入其中的内容   压缩包

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

从文件或标准输入流

加载tar tar存储库

答案 1 :(得分:1)

作为Docker新手,我以困难的方式了解了这种差异。

  • 在一个系统上:

    docker run -it myImage /bin/bash
    

    ->正常工作

  • 在同一系统上:

    docker **save** myImage -o myImage.tar
    
  • 在第二个系统上:

    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的错误消息并没有使我对“导入”原因有任何了解,直到我迷失了这篇文章。

答案 2 :(得分:0)

docker import 通常与从运行容器中创建的tarball一起使用。例如 docker export containerID> /home/cntr.tar ,然后将此tarball导入到图像中。 docker import /home/cntr.tar mynewimage:tag

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

将其重新加载

尽管docker用图像保存/加载的主要区别确实保留了图像历史记录。带有容器的Docker导出/导入通过删除容器的所有历史记录来使图像变平。