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" }
としたほうが楽そうです。