import和load在Docker中有什么区别?

vatpfxk5  于 2023-05-06  发布在  Docker
关注(0)|答案(4)|浏览(207)

我理解export(用于容器)和save(用于图像)之间的区别。但是在一天结束的时候,由保存或export生成的tarball应该被用作 * 一个图像 *。
那么为什么有两个命令来从tarball创建图像呢?

ilmyapht

ilmyapht1#

docker save确实会生成一个tarball,* 但是 * 包含所有父层和所有标签+版本。
docker export也会生成一个tarball,但没有任何层/历史记录。
它通常用于当一个人想要"flatten" an image时,如来自Thomas Uhrig的“Flatten a Docker container or image”所示:

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

但是,一旦生成了这些tarball,load/import就可以:

  • docker import从 * 一个 * tarball创建 * 一个 * 镜像,它甚至不是 * 一个镜像(只是一个你想作为镜像导入的文件系统)

创建一个空文件系统映像并导入tarball的内容
这个导入的映像本身将无法从docker run运行,因为它没有与之关联的元数据(例如要运行的CMD是什么。)

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

从文件或标准输入流中加载一个tar存储库
通过使用load,您可以以与最初使用Dockerfile中的元数据创建图像相同的方式导入图像,因此您可以直接使用docker run运行它们。

qoefvg9y

qoefvg9y2#

作为一个Docker-newbie,我学到了这种差异的艰难的方式

  • 在一个系统上:
docker run -it myImage /bin/bash

--〉工作正常

  • 在同一系统上(使用保存):
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的错误消息并没有让我在任何意义上走向“导入”的原因,直到我偶然发现这篇文章。

yacmzcpb

yacmzcpb3#

  • docker import* 主要用于在运行容器外创建的tarball。对于例如 docker export containerID〉/home/cntr.tar,然后将此tarball导入到图像中。docker import/home/cntr.tar mynewimage:tag

docker load 用于从另一个镜像创建的tarball中加载镜像。例如,docker保存〉/home/fromimg.tar,然后使用 docker load〈/home/fromimg.tar 加载它
docker保存/load with image的主要区别是保留了图像历史。而docker export/import with container则通过删除容器的所有历史来扁平化图像。

r1zk6ea1

r1zk6ea14#

我想分享使用docker save和在prod服务器上使用docker importdocker load的另一个区别。
在可以访问Internet的服务器上,docker import的工作方式与docker load相同。容器已启动并运行,没有错误,缺失的图层已通过互联网下载。
在服务器上没有internet - on-prem设置docker import导致容器启动时出现上述错误,例如
docker:来自守护进程的错误响应:OCI运行时创建失败:container_linux.go:345:启动容器进程导致“exec:“/bin/bash”:stat /bin/bash:没有这样的文件或目录”:未知。
为了让保存的容器在没有它的情况下运行,我们需要使用docker load < saved-container.tgz以这种方式导入所有层。

相关问题