😎

Dockerイメージに含まれているデータを抽出する

2022/03/05に公開約2,300字

Dockerのイメージからデータを抽出したいといった場合にどのようにすれば良いか調べてみました。

基本的にDockerのコンテナが動いている場合は、コンテナからホスト側にcpコマンドで持ってくるのが早いと思います。
コンテナをすぐに動かせない場合や、コンテナに入っているデータを丸っと持ってきたいんだといった場合にこの記事が参考になればと思います。

早速下記のDockerイメージを利用してデータを抽出してみたいと思います。

https://hub.docker.com/r/yngu/demo-docker-simple-image

イメージの元となったソースリポジトリは下記になります。

https://github.com/ynug/demo-docker-simple-image/tree/1.0

まずは、下記のコマンドでイメージを取得します。
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イメージの構造については割愛しますが、下記の記事などがわかりやすいかと思います。

https://qiita.com/zembutsu/items/24558f9d0d254e33088f

さて、各Layerのフォルダが表示されたのは良いですが、フォルダ名からどんなことをしているか推測できません。
そこで、diveというDockerイメージの構造を確認するソフトを利用します。

https://github.com/wagoodman/dive

現状では、表示されるコマンドが長くなった場合に折り返しされず見切れてしまいます。
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に表示される変更されたファイルからあたりをつけていくことになります。
今回は、Layers43 B COPY app /app # buildkit行がアプリをコピーしている感じがするので、フォーカスしてみてCurrent Layer Contentsで変更を確認してみます。
すると、app/hello.jsが追加されいることが確認できます。

ここまで来れば、Layer DetailsIDの値を記憶して展開してみます。
実際にhello.jsが取り出せたのが分かるかと思います。

Discussion

ログインするとコメントできます