我理解export
(对于容器)和save
(对于图像)之间的区别。但是在一天结束时,由保存或导出生成的tarball应该用作图像。
那么为什么有两个命令来从tarball制作图像呢?
答案 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导出/导入通过删除容器的所有历史记录来使图像变平。