我们以鲸鱼图像为例.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
Run Code Online (Sandbox Code Playgroud)
我想提取一下所说的图层ADD file:bla.有这样的工具/方式吗?
在这种特定情况下,看起来该ADD命令将基本映像添加到文件系统.如果运行docker history --no-trunc docker/whalesay,则完整命令为:
/bin/sh -c #(nop) ADD file:f4d7b4b3402b5c53f266bb7fdd7e728493d9a17f9ef20c8cb1b4759b6e66b70f in /
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
看起来像个不错的候选人!您现在可以提取该图层并从中提取文件.
$ tar xf whalesay.tar cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar
$ tar xf cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar etc/passwd
Run Code Online (Sandbox Code Playgroud)
如果您想要从图层中提取特定文件,但是您不知道哪个图层,则可以执行此操作.首先,提取所有图层:
$ tar xf whalesay.tar
Run Code Online (Sandbox Code Playgroud)
现在你已经将所有图层都作为单独的.tar文件.我们找一个文件:
$ 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
Run Code Online (Sandbox Code Playgroud)
最后,从您想要的图层中提取文件:
$ tar xf 0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar \
usr/local/share/cows/docker.cow
Run Code Online (Sandbox Code Playgroud)
这将使用相对于当前目录的完整路径提取该文件.
$ cat usr/local/share/cows/docker.cow
##
## Docker Cow
##
$the_cow = <<EOC;
$thoughts
$thoughts
$thoughts
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\\______ o __/
\\ \\ __/
\\____\\______/
EOC
Run Code Online (Sandbox Code Playgroud)
看起来其他人也想拥有这个功能,但不幸的是现在它似乎并不存在.
如果您可以保存完整的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
Run Code Online (Sandbox Code Playgroud)
现在foobar.tar将包含来自不同时间的文件系统状态.检查这个压缩包节目,在我的情况,文件repositories与
{"foobar":{"latest":"fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562"}}
Run Code Online (Sandbox Code Playgroud)
表示最新的图层是fdf43....您可以通过此层的文件系统内容获取tarball
tar -x fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562/layer.tar -f foobar.tar
Run Code Online (Sandbox Code Playgroud)
有一个工具, undocker,它自动化这个过程,但我不确定它是否适用于保存的tar文件的当前格式.
小智 2
我不太明白“提取”的意思,但如果您想获得有关图像的更多信息,请运行
docker inspect <image_name>
Run Code Online (Sandbox Code Playgroud)
您想要获取文件,然后从此映像运行容器。尝试
docker export <container_name> > abc.tar
Run Code Online (Sandbox Code Playgroud)
之后,解压 abc.tar并找到您的文件。
| 归档时间: |
|
| 查看次数: |
7042 次 |
| 最近记录: |