2016-11-13 43 views
5

讓我們以鯨魚圖像爲例。 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層。有沒有一種工具可以做到這一點?

+0

「提取」是什麼意思? –

+0

根據https://github.com/docker/docker/blob/master/image/spec/v1.md,圖層是一個JSON文件,並對文件系統進行實際更改。所以理想情況下提取將給我兩個 – lang2

回答

2

我真的不明白你所說的「提取物」的意思,但如果你想獲得有關圖像的更多信息,請運行

docker inspect <image_name> 

你想要得到的文件,然後從該映像運行容器。嘗試

docker export <container_name> > abc.tar 

後,提取物abc.tar,找到你的文件。

+1

這基本上是我想要的,但我希望能夠指定一個圖層,而不是整個事情。 – lang2

4

它看起來像其他人也想擁有這個功能,但不幸的是現在它似乎並不存在。

又見 this issue 和這裏 related request 這得到了拒絕。

如果你罰款保存完整泊塢窗(docker save),然後用你的層提取壓縮包,那麼這是可能的:

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將包含來自不同時間的文件系統狀態。檢查這個壓縮包節目,在我的情況,文件repositories

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

這表明,該最新層爲fdf43...。您可以通過

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

有一個工具,讓這個層的文件系統內容的壓縮包, undocker, 其自動化這個過程,但我不知道它是否會與當前工作的格式保存的tar文件。

1

在這種特定情況下,它看起來像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文件。讓我們找到一個文件:

$ 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 

這將提取該文件全相對於當前目錄的路徑。

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