tkuchikiの日記

新ブログ https://blog.tkuchiki.net

docker run -v で mount したディレクトリを見やすく出力するワンライナー

執筆時の環境は docker 1.3.2 ですが、ある程度バージョンが前後してもそのまま使えると思います。

はじめに

docker run -v /data1:/tmp/data とした場合は、
docker host の /tmp/data を mount していることがわかります。
しかし、docker run -v /data1 のように、docker host 側の ディレクトリを指定しなかった場合は、
/var/lib/docker/vfs/dir 以下にディレクトリができ、そのディレクトリを mount します。

これは、docker inspect --format='{{.Volumes}}' で確認できますが、それを見やすく表示するワンライナーの書き方についてです。

事前準備

以下のように、docker run 時に /data1 /data2 を mount します。

## docker host
$ docker run -v /data1 -v /data2 -it centos:latest /bin/bash

container に入って、テキトーなファイルを作ります。

## docker container
[root@723f53a59887 /]# echo hogehoge > /data1/testfile
[root@723f53a59887 /]# echo foobar > /data2/testfile
[root@723f53a59887 /]# exit
exit

container id を確認します(コマンド打たなくても表示されていますが...)。

## docker host
$ docker ps -a -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
723f53a59887        centos:latest       "/bin/bash"         2 minutes ago       Exited (0) About a minute ago                       goofy_mcclintock

volume の確認

本題です。
ワンライナーで書くと以下のようになります。

$ docker inspect --format='{{.Volumes}}' 723f53a59887 | sed -e 's/^map\[\(.*\)]/\1/' | tr " " "\n"
/data1:/var/lib/docker/vfs/dir/4d02dda9422dd3e7e6fb9b64eb2d2fe3f59740bf57ce027b5dec92ef3cbabf08
/data2:/var/lib/docker/vfs/dir/ee7fbb4703d6f3531595e73e8b91149d4727ff119dbc8dd8ed102030a4c5d74a

ワンライナーの説明

ワンライナーの説明をする前に、 sed と tr をかまさない場合の表示を示します。

$ docker inspect --format='{{.Volumes}}' 723f53a59887
map[/data1:/var/lib/docker/vfs/dir/4d02dda9422dd3e7e6fb9b64eb2d2fe3f59740bf57ce027b5dec92ef3cbabf08 /data2:/var/lib/docker/vfs/dir/ee7fbb4703d6f3531595e73e8b91149d4727ff119dbc8dd8ed102030a4c5d74a]

Go の fmt.Printf で出力したような、"map[ ]" で囲まれてた状態で表示されます。

sed正規表現で、"map[ ]" の中身を抽出します。
出力は以下のようになります。

$ docker inspect --format='{{.Volumes}}' 723f53a59887 | sed -e 's/^map\[\(.*\)]/\1/'
/data1:/var/lib/docker/vfs/dir/4d02dda9422dd3e7e6fb9b64eb2d2fe3f59740bf57ce027b5dec92ef3cbabf08 /data2:/var/lib/docker/vfs/dir/ee7fbb4703d6f3531595e73e8b91149d4727ff119dbc8dd8ed102030a4c5d74a

このままだと若干見にくいので、スペースを改行に変換します。
それを tr " " "\n" で行っています。

確認

docker host からファイルが参照できるか確認します。
先ほどのワンライナーの出力結果をもとに、以下を実行すると、

$ cat /var/lib/docker/vfs/dir/4d02dda9422dd3e7e6fb9b64eb2d2fe3f59740bf57ce027b5dec92ef3cbabf08/testfile
hogehoge

$ cat /var/lib/docker/vfs/dir/ee7fbb4703d6f3531595e73e8b91149d4727ff119dbc8dd8ed102030a4c5d74a/testfile
foobar

ファイルがあることが確認できます。

まとめ

docker inspect --format='{{.Volumes}} の結果を見やすくするワンライナーを紹介しました。
ただ、少し長いので、jq が使える場合は、

$ docker inspect 723f53a59887 | jq '.[] .Volumes'
{
  "/data2": "/var/lib/docker/vfs/dir/ee7fbb4703d6f3531595e73e8b91149d4727ff119dbc8dd8ed102030a4c5d74a",
  "/data1": "/var/lib/docker/vfs/dir/4d02dda9422dd3e7e6fb9b64eb2d2fe3f59740bf57ce027b5dec92ef3cbabf08"
}

としたほうが楽そうです。