🚢
docker container のファイルシステムをコンテナ起動しないで読み出す
コンテナのファイルシステムには通常コンテナを起動してアクセスするが、コンテナを起動せずにアクセスしたいケースがあった。
(具体的には postgres の PGDATA がコンテナのファイルシステムに保存されてしまってて、postgres が起動していない状態でコピーしたかった)
docker inspect
で overlay filesystem の情報が得られるので、それをマウントしてやればよい。
例
$ sudo -s
# コンテナ作成、ファイル書き込み
$ docker run -ti alpine sh
echo foo > foo.txt
exit
# Container ID を確認
$ docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a42aea5a99d0 alpine "sh" 27 seconds ago Exited (0) 11 seconds ago pedantic_kowalevski
$ docker inspect a42aea5a99d0
...
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7-init/diff:/var/lib/docker/overlay2/29e4aefbacadeb89e7793115c02c30cb167774d083af2bbd8a617b4d2b8426af/diff",
"MergedDir": "/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7/merged",
"UpperDir": "/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7/diff",
"WorkDir": "/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7/work"
},
"Name": "overlay2"
},
...
# マウント先作成
mkdir /mnt/merged
# overlay fs をマウント
# mount -t overlay overlay -o lowerdir=<上記のLowerDir>,upperdir=<上記のUpperDir>,workdir=<上記のWorkDir> <マウント先>
mount -t overlay overlay -o \
lowerdir=/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7-init/diff:/var/lib/docker/overlay2/29e4aefbacadeb89e7793115c02c30cb167774d083af2bbd8a617b4d2b8426af/diff,\
upperdir=/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7/diff,\
workdir=/var/lib/docker/overlay2/162e96d4ab67f7b86a644ef5f59cfd6a4fe57ff081fd1826f9ebd0d2d8cd7ef7/work \
/mnt/merged
# ファイルにアクセスしてみる
$ cat /mnt/merged/foo.txt
foo
# 用事が済んだら umount しておく
$ umount /mnt/merged
$ rmdir /mnt/merged
Discussion