docker:docker导入的对面

使用docker import创build的映像无法运行,因为缺less必要的文件。

我正在尝试debugging图像中的内容以及缺less的内容。

我曾经尝试过

  • docker save创build一个tarball,但它不是一个简单的包含文件,但所有types的元数据
  • docker export需要一个运行的容器。

我有其他的select吗?

如果图像有一个工作的shell,使用它进行debugging。

 docker run -ti BROKEN_IMAGE sh 

如果一个shell不起作用, export图像的内容,你将有一个tar文件,你可以提取某处并检查。

 CID=$(docker create BROKEN_IMAGE) docker export $CID | tar -tvf - 

详情

docker import的源文件/数据应该是平面图像内容的tar文件。 可以使用tar命令在某处查看或提取此数据:

 $ CID=$(docker create busybox) $ docker export $CID > myimage.tar $ tar -tvf myimage.tar -rwxr-xr-x 0 0 0 0 28 Nov 01:03 .dockerenv drwxr-xr-x 0 0 0 0 1 Nov 22:58 bin/ -rwxr-xr-x 0 0 0 1049688 1 Nov 22:58 bin/[ -rwxr-xr-x 0 0 0 0 1 Nov 22:58 bin/[[ link to bin/[ -rwxr-xr-x 0 0 0 0 1 Nov 22:58 bin/acpid link to bin/[ ... 

如果文件/数据来自docker save则会有额外的图层来满足图像元数据和图层。

 $ docker save busybox | tar -tvf - drwxr-xr-x 0 0 0 0 3 Nov 22:39 036a82c6d65f2fa43a13599661490be3fca1c3d6790814668d4e8c0213153b12/ -rw-r--r-- 0 0 0 3 3 Nov 22:39 036a82c6d65f2fa43a13599661490be3fca1c3d6790814668d4e8c0213153b12/VERSION -rw-r--r-- 0 0 0 1174 3 Nov 22:39 036a82c6d65f2fa43a13599661490be3fca1c3d6790814668d4e8c0213153b12/json -rw-r--r-- 0 0 0 1337856 3 Nov 22:39 036a82c6d65f2fa43a13599661490be3fca1c3d6790814668d4e8c0213153b12/layer.tar -rw-r--r-- 0 0 0 1497 3 Nov 22:39 6ad733544a6317992a6fac4eb19fe1df577d4dec7529efec28a5bd0edad0fd30.json -rw-r--r-- 0 0 0 203 1 Jan 1970 manifest.json -rw-r--r-- 0 0 0 90 1 Jan 1970 repositories 

LAYER_ID/layer.tar文件包含需要按照manifest.json中的Layers数组的顺序提取的每个图层内容。

 $ cat manifest.json | jq [ { "Config": "6ad733544a6317992a6fac4eb19fe1df577d4dec7529efec28a5bd0edad0fd30.json", "RepoTags": [ "busybox:latest" ], "Layers": [ "036a82c6d65f2fa43a13599661490be3fca1c3d6790814668d4e8c0213153b12/layer.tar" ] } ] 

Docker不需要运行容器就可以运行docker export ,只需要一个容器:

 docker create --name toexport brokenimage docker export toexport -o exported.tar docker rm toexport 

docker savedocker load命令互补,可以用来保存一个合适格式的图像以便导入,保存每个图像层和图像元数据。 这就是为什么生成的tarball里面有更多的tarball。