我了解export
(对于容器)和save
(对于图像)之间的区别。但最终,保存或导出产生的压缩包都应用作图像。
那么,为什么有2条命令可以从压缩包制作图像呢?
Answers:
docker save
确实会产生一个tarball,但包含所有父图层以及所有标签+版本。
docker export
也会产生压缩包,但没有任何层/历史记录。
当人们想要“展平”映像时,通常使用它,如Thomas Uhrig的“展平Docker容器或映像”所示:
docker export <CONTAINER ID> | docker import - some-image-name:latest
但是,一旦生成了这些压缩包,就可以进行加载/导入:
docker import
从一个tarball创建一个图像,甚至不是图像(只是要导入为图像的文件系统)创建一个空的文件系统映像并导入tarball的内容
docker load
从一个有问题的存储库创建潜在的多个图像(因为docker save
可以在一个tarball中保存多个图像)。从文件或标准输入流中加载已tartar的存储库
作为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
泊坞窗:来自守护程序的错误响应:OCI运行时创建失败:container_linux.go:345:启动容器进程引起“ exec:\” / bin / bash \”:stat / bin / bash:无此类文件或目录”:未知。
寻找该错误使我有各种原因,例如MountFlags="slave"
,但是真正的原因却是本文中描述的原因:我应该使用load而不是import。不知道发生了什么,Docker的错误消息并没有使我对“导入”原因有任何了解,直到我偶然发现了这篇文章。
docker import通常与从正在运行的容器中创建的tarball一起使用。例如 docker export containerID> /home/cntr.tar然后将这个tarball导入到图像中。docker导入/home/cntr.tar mynewimage:tag
而docker load用于从另一个映像创建的tarball加载映像。例如 docker save> /home/fromimg.tar然后使用docker load </home/fromimg.tar将其重新加载
尽管docker用图像保存/加载的主要区别是确实保留了图像历史记录。码头工人使用容器导出/导入通过删除容器的所有历史记录来使图像变平。
docker image import
的同义词docker import
吗?