要約
イメージから直接は取り出せないので以下のようにコンテナを起動してdocker cp
でコピーする
CONTAINER_ID=`docker create $IMAGE_NAME`
docker cp $CONTAINER_ID:$FILEPATH .
背景
バグや仕様調査のためにデプロイしたImage内のソースコードやファイルを取り出したいことがあります。
そのときにどうやればいいかの手順をまとめました。
対象ファイルパスを見つける
対象のファイルやディレクトリのパスがわかっていればよいのですが、そうではない場合は中身を調べて目的のものを見つける必要があります。
シェルを利用して探す
だいたい/bin/bashや/bin/shが入っているはずなのでそれを利用して対話的にファイルを見つけます
docker run --rm -it $IMAGE_NAME /bin/bash
入ってなければDockerfileのベースイメージとして使い、インストールしたイメージを作ってしまうのも手です。
diveでレイヤごとの差分を見て探す
dive を利用することでレイヤごとにファイルツリーを見ることが出来ます。
特定のレイヤで追加されたことがわかっているような場合にはこちらのほうが素早く探せる場合があります。
dive $IMAGE_NAME
diveの使い方は以下の記事が参考になります。
https://qiita.com/t_o_d/items/625ad7a274ca34be3312
対象のファイルをコピーする
イメージからファイルは基本的には直接取り出せないみたいです。
そのため、以下のようにコンテナを起動してdocker cp
でコピーすることでファイル・フォルダをコピーできます。
# IMAGE_NAMEに対象のイメージ名、 FILEPATH に対象のファイルのDocker Image内のファイルパスをセット
IMAGE_NAME=me/my_application:1.0.0
FILEPATH=/app/scripts/woker/
CONTAINER_ID=`docker create $IMAGE_NAME`
docker cp $CONTAINER_ID:$FILEPATH .
docker rm $CONTAINER_ID