我理解export(用于容器)和save(用于图像)之间的区别。但是在一天结束的时候,由保存或export生成的tarball应该被用作 * 一个图像 *。那么为什么有两个命令来从tarball创建图像呢?
export
save
ilmyapht1#
docker save确实会生成一个tarball,* 但是 * 包含所有父层和所有标签+版本。docker export也会生成一个tarball,但没有任何层/历史记录。它通常用于当一个人想要"flatten" an image时,如来自Thomas Uhrig的“Flatten a Docker container or image”所示:
docker save
docker export
docker export <CONTAINER ID> | docker import - some-image-name:latest
但是,一旦生成了这些tarball,load/import就可以:
docker import
创建一个空文件系统映像并导入tarball的内容这个导入的映像本身将无法从docker run运行,因为它没有与之关联的元数据(例如要运行的CMD是什么。)
docker run
CMD
docker load
从文件或标准输入流中加载一个tar存储库通过使用load,您可以以与最初使用Dockerfile中的元数据创建图像相同的方式导入图像,因此您可以直接使用docker run运行它们。
load
qoefvg9y2#
作为一个Docker-newbie,我学到了这种差异的艰难的方式。
docker run -it myImage /bin/bash
--〉工作正常
docker save myImage -o myImage.tar
docker import myImage.tar
--〉工作得很好,没有问题,只是需要标记:
docker tag _the_assigned_tag myImage
docker:守护进程错误响应:OCI运行时创建失败:container_linux.go:345:启动容器进程导致“exec:"/bin/bash":stat /bin/bash:没有这样的文件或目录”:未知
寻找这个错误给我带来了各种各样的原因,比如MountFlags="slave",但真实的的原因是这篇文章中描述的:我应该使用load而不是import。不知道发生了什么,Docker的错误消息并没有让我在任何意义上走向“导入”的原因,直到我偶然发现这篇文章。
MountFlags="slave"
yacmzcpb3#
而 docker load 用于从另一个镜像创建的tarball中加载镜像。例如,docker保存〉/home/fromimg.tar,然后使用 docker load〈/home/fromimg.tar 加载它docker保存/load with image的主要区别是保留了图像历史。而docker export/import with container则通过删除容器的所有历史来扁平化图像。
r1zk6ea14#
我想分享使用docker save和在prod服务器上使用docker import与docker 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以这种方式导入所有层。
docker load < saved-container.tgz
4条答案
按热度按时间ilmyapht1#
docker save
确实会生成一个tarball,* 但是 * 包含所有父层和所有标签+版本。docker export
也会生成一个tarball,但没有任何层/历史记录。它通常用于当一个人想要"flatten" an image时,如来自Thomas Uhrig的“Flatten a Docker container or image”所示:
但是,一旦生成了这些tarball,load/import就可以:
docker import
从 * 一个 * tarball创建 * 一个 * 镜像,它甚至不是 * 一个镜像(只是一个你想作为镜像导入的文件系统)创建一个空文件系统映像并导入tarball的内容
这个导入的映像本身将无法从
docker run
运行,因为它没有与之关联的元数据(例如要运行的CMD
是什么。)docker load
从一个tarred存储库中创建潜在的 * 多个 * 图像(因为docker save
可以在一个tarball中保存 * 多个 * 图像)。从文件或标准输入流中加载一个tar存储库
通过使用
load
,您可以以与最初使用Dockerfile中的元数据创建图像相同的方式导入图像,因此您可以直接使用docker run
运行它们。qoefvg9y2#
作为一个Docker-newbie,我学到了这种差异的艰难的方式。
--〉工作正常
--〉工作得很好,没有问题,只是需要标记:
docker:守护进程错误响应:OCI运行时创建失败:container_linux.go:345:启动容器进程导致“exec:"/bin/bash":stat /bin/bash:没有这样的文件或目录”:未知
寻找这个错误给我带来了各种各样的原因,比如
MountFlags="slave"
,但真实的的原因是这篇文章中描述的:我应该使用load而不是import。不知道发生了什么,Docker的错误消息并没有让我在任何意义上走向“导入”的原因,直到我偶然发现这篇文章。yacmzcpb3#
而 docker load 用于从另一个镜像创建的tarball中加载镜像。例如,docker保存〉/home/fromimg.tar,然后使用 docker load〈/home/fromimg.tar 加载它
docker保存/load with image的主要区别是保留了图像历史。而docker export/import with container则通过删除容器的所有历史来扁平化图像。
r1zk6ea14#
我想分享使用
docker save
和在prod服务器上使用docker import
与docker 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
以这种方式导入所有层。