docker工人:从图像中提取一个图层

让我们以鲸鱼图像为例。 docker history显示如下:

 IMAGE CREATED CREATED BY SIZE COMMENT 6b362a9f73eb 17 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/us 0 B <missing> 17 months ago /bin/sh -c sh install.sh 30.37 kB <missing> 17 months ago /bin/sh -c git reset --hard origin/master 43.27 kB <missing> 17 months ago /bin/sh -c #(nop) WORKDIR /cowsay 0 B <missing> 17 months ago /bin/sh -c git clone https://github.com/moxie 89.9 kB <missing> 17 months ago /bin/sh -c apt-get -y update && apt-get insta 58.58 MB <missing> 18 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 18 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB <missing> 18 months ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB <missing> 18 months ago /bin/sh -c #(nop) ADD file:f4d7b4b3402b5c53f2 188.1 MB 

我想提取ADD file:bla的图层ADD file:bla 。 有没有一个工具/方法来做到这一点?

我不明白你的意思是“提取”,但如果你想获得关于图像的更多信息,请运行

 docker inspect <image_name> 

你想获得文件,然后从这个图像运行容器。 尝试

 docker export <container_name> > abc.tar 

之后, 提取 abc.tar并find你的文件。

它看起来像其他人也想有这个function,但不幸的是现在似乎并不存在。

另见这个问题 ,在这里被拒绝的相关请求 。

如果你保存完整的docker( docker save ),然后用你的图层提取一个tarball,那么这是可能的:

 docker run -it <your image> # do fancy stuff in the container docker commit <your container> foobar # create image from container docker history foobar # will show you the layers docker save -o foobar.tar foobar # dumps container contents to foobar.tar 

现在foobar.tar将包含不同时间的文件系统状态。 检查这个tarball在我的情况下显示一个文件repositories

 {"foobar":{"latest":"fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562"}} 

这表明,最新的图层是fdf43... 你可以通过这个图层的文件系统内容获得一个tarball

 tar -x fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562/layer.tar -f foobar.tar 

有一个工具, undocker ,它自动化这个过程,但我不知道它是否将与保存的tar文件的当前格式。

在这种情况下,看起来像ADD命令将基本映像添加到文件系统。 如果你运行docker history --no-trunc docker/whalesay ,完整的命令是:

 /bin/sh -c #(nop) ADD file:f4d7b4b3402b5c53f266bb7fdd7e728493d9a17f9ef20c8cb1b4759b6e66b70f in / 

docker history报告,特定的层是188MB。 让我们更详细地看看这些图层:

 $ docker save docker/whalesay -o whalesay.tar $ tar tvf whalesay.tar ... -rw-r--r-- 0/0 197181952 2015-05-25 22:04 cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar ... 

看起来像一个很好的候选人! 您现在可以提取该图层并将文件拉出。

 $ tar xf whalesay.tar cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar $ tar xf cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar etc/passwd 

如果你正在寻找一个特定的文件,但你不知道一层,你可以这样做。 首先,提取所有图层:

 $ tar xf whalesay.tar 

现在,您已将所有图层作为单独的.tar文件。 让我们find一个文件:

 $ for layer in */layer.tar; do tar -tf $layer | grep docker.cow && echo $layer; done usr/local/share/cows/docker.cow 0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar cowsay/cows/docker.cow 40e8ae7bb4e5b9eaac56f5be7aa614ed50f163020c87ba59e905e01ef0af0a4f/layer.tar cowsay/cows/docker.cow f9bc8676543761ff3033813257937aeb77e9bc84296eaf025e27fe01643927cf/layer.tar 

最后,从你想要的图层中提取文件:

 $ tar xf 0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar \ usr/local/share/cows/docker.cow 

这将使用相对于当前目录的完整path来提取该文件。

 $ cat usr/local/share/cows/docker.cow ## ## Docker Cow ## $the_cow = <<EOC; $thoughts $thoughts $thoughts ## . ## ## ## == ## ## ## ## === /""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \\______ o __/ \\ \\ __/ \\____\\______/ EOC