2016-11-13 18 views
5

例として、whalesay画像を見てみましょう。 docker historyは、次のことを示していますdocker:画像からレイヤーを抽出する

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)を保存して、あなたの層で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は異なる時間からのファイルシステムの状態が含まれます。最新層がfdf43...であることを、示して

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

で、私の場合には、ファイルrepositoriesこのtarボールショーを点検。あなたは、ツールがある

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

経由 undocker、このプロセスを自動化 をこの層のファイルシステムの内容とのtarballを得ることができますが、私はそれが現在の形式で動作するかどうかわからないんだけど保存されたtarファイル

1

この具体的なケースでは、ADDコマンドがベースイメージをファイルシステムに追加したようです。あなたがdocker history --no-trunc docker/whalesayを実行した場合、完全なコマンドは次のとおりです。

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

docker historyは、特定の層が188メガバイトであることを報告します。これらのレイヤーをより詳細に見てみましょう:

$ 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 
関連する問題