Dockerイメージに含まれているデータを抽出する
Dockerのイメージからデータを抽出したいといった場合にどのようにすれば良いか調べてみました。
基本的にDockerのコンテナが動いている場合は、コンテナからホスト側にcp
コマンドで持ってくるのが早いと思います。
コンテナをすぐに動かせない場合や、コンテナに入っているデータを丸っと持ってきたいんだといった場合にこの記事が参考になればと思います。
早速下記のDockerイメージを利用してデータを抽出してみたいと思います。
イメージの元となったソースリポジトリは下記になります。
まずは、下記のコマンドでイメージを取得します。
docker pull yngu/demo-docker-simple-image:1.0
イメージが取得できたら試しに下記のコマンドで実行してみましょう。
docker run --rm yngu/demo-docker-simple-image:1.0
実行すると、Hello Wrold!
と表示されます。
イメージからデータを取り出すコマンドは下記になります。
tarファイルで出力されるので、拡張子はtar
にすることをお勧めします。
docker save -o <出力ファイル名> <IMAGE_ID>
今回の場合だと下記のコマンドを実行します。
docker save -o hello-image-extraction.tar yngu/demo-docker-simple-image:1.0
出力されたtarファイルを展開すると各Layerのフォルダが表示されます。
各Layerフォルダ内にlayer.tar
という物が存在していて、これを展開するとファイルを抽出出来ます。
この記事では、Dockerイメージの構造については割愛しますが、下記の記事などがわかりやすいかと思います。
さて、各Layerのフォルダが表示されたのは良いですが、フォルダ名からどんなことをしているか推測できません。
そこで、dive
というDockerイメージの構造を確認するソフトを利用します。
現状では、表示されるコマンドが長くなった場合に折り返しされず見切れてしまいます。
Add option to wrap long commands - Layer Details
コマンドだけ見たいといった場合は、下記のコマンドで一覧を確認することが出来ます。
docker history --no-trunc yngu/demo-docker-simple-image:1.0
dive
を利用してイメージを確認するには、下記のコマンドを実行します。
dive <IMAGE_ID>
今回の場合だと下記のコマンドを実行します。
dive yngu/demo-docker-simple-image:1.0
そうすると下記の画像のような画面が表示されるかと思います。
- 画面左上
Layers
:
レイヤの一覧が表示され、変更内容を確認したいレイヤに移動できる - 画面左中
Layer Details
:
Layers
でフォーカスされているレイヤでなにを実行しているかを表示
ここのID
名が展開したLayerのフォルダ名になっている - 画面左下
Image Details
:
イメージ全体の情報を表示 - 画面右
Current Layer Contents
:
Layersで指定したレイヤーに含まれているファイルツリーをサイズと共に表示
せっかくなので、ここではHello Wrold!
と表示しているスクリプトを取り出してみたいと思います。
自分が作ったイメージでない場合、Layers
のコマンドとCurrent Layer Contents
に表示される変更されたファイルからあたりをつけていくことになります。
今回は、Layers
の43 B COPY app /app # buildkit
行がアプリをコピーしている感じがするので、フォーカスしてみてCurrent Layer Contents
で変更を確認してみます。
すると、app/hello.js
が追加されいることが確認できます。
ここまで来れば、Layer Details
のID
の値を記憶して展開してみます。
実際にhello.js
が取り出せたのが分かるかと思います。
Discussion