🚢

docker container のファイルシステムをコンテナ起動しないで読み出す

2024/07/24に公開

コンテナのファイルシステムには通常コンテナを起動してアクセスするが、コンテナを起動せずにアクセスしたいケースがあった。

(具体的には 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