export
我了解(对于容器)和save
(对于图像)之间的区别。但是在一天结束时,保存或导出生成的压缩包应该用作图像。
那么为什么有 2 个命令可以从 tarball 制作图像呢?
export
我了解(对于容器)和save
(对于图像)之间的区别。但是在一天结束时,保存或导出生成的压缩包应该用作图像。
那么为什么有 2 个命令可以从 tarball 制作图像呢?
docker save
确实会生成一个 tarball,但包含所有父层和所有标签 + 版本。
docker export
也会产生一个 tarball,但没有任何层/历史。
它通常在想要“展平”图像时使用,如Thomas Uhrig的“展平 Docker 容器或图像”中所示:
docker export <CONTAINER ID> | docker import - some-image-name:latest
但是,一旦生成了这些 tarball,加载/导入就可以:
docker import
从一个甚至不是图像的tarball创建一个图像(只是您要作为图像导入的文件系统)创建一个空的文件系统映像并导入 tarball 的内容
docker load
从 tarred 存储库创建可能的多个docker save
图像(因为可以将多个图像保存在 tarball 中)。从文件或标准输入流加载 tarred 存储库
作为一个 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
docker:来自守护进程的错误响应: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 导入到图像中。码头工人进口 /home/cntr.tar mynewimage:tag
而docker load用于从另一个图像创建的 tarball 加载图像。例如。docker save > /home/fromimg.tar然后用docker load < /home/fromimg.tar加载它
尽管 docker save/load with image 的主要区别确实保留了图像历史记录。而带有容器的 docker export/import 通过删除容器的所有历史来使图像变平。