dockerのイメージを壊した話。
dockerで遊んでいたところ。
/bin/bash: error while loading shared libraries: /lib64/libtinfo.so.5: invalid ELF header
むむむ。
何も出来なくなった。
ここで、dockerのイメージ管理について簡単に説明。
詳細は http://enakai00.hatenablog.com/entry/20140420/1397981156 とかで。
ざっくり言うと、100GBくらいの巨大なファイルの中にベースとなるOSのイメージと、
各コンテナのイメージ差分が格納されている。(はず)
[root@docker-host ~]# ls -aldh /var/lib/docker/devicemapper/devicemapper/data -rw------- 1 root root 100G Jul 17 14:55 /var/lib/docker/devicemapper/devicemapper/data
先ほどの記事に倣ってマウントしてみる。
今回はdc934b46cab6を。
[root@docker-host ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dc934b46cab6 centos:6-build-test2 "/bin/bash -l" 9 days ago Exited (127) 20 hours ago prickly_colden e3992f5f8eac centos:6-build-test2 "/bin/bash -l" 2 weeks ago Exited (130) 2 weeks ago elegant_jang [root@docker-host ~]# cat /var/lib/docker/devicemapper/metadata/dc934b46cab6618f155c5d298bfb5b0ec67960e4c3889b2076c9c42ab749d554 {"device_id":162,"size":10737418240,"transaction_id":497,"initialized":false} [root@docker-host ~]# ls -ald /dev/mapper/docker-* lrwxrwxrwx 1 root root 7 Jun 29 20:03 /dev/mapper/docker-252:3-13370648-pool -> ../dm-0 [root@docker-host ~]# device_id=162 [root@docker-host ~]# size=10737418240 [root@docker-host ~]# pool=docker-252:3-13370648-pool [root@docker-host ~]# dmsetup create myvol --table "0 $(($size / 512)) thin /dev/mapper/$pool $device_id" [root@docker-host ~]# mount /dev/mapper/myvol /mnt [root@docker-host ~]# mount | grep -F /dev/mapper/myvol /dev/mapper/myvol on /mnt type ext4 (rw) [root@docker-host ~]# df -h /mnt Filesystem Size Used Avail Use% Mounted on /dev/mapper/myvol 9.9G 702M 8.7G 8% /mnt
マウント出来たのでdockerの中のファイルがどうなってしまったのか見てみる。
[root@docker-host ~]# chroot /mnt/rootfs/ /bin/bash /bin/bash: error while loading shared libraries: /lib64/libtinfo.so.5: invalid ELF header [root@docker-host ~]# ls -al /mnt/rootfs/lib64/libtinfo.so.5 lrwxrwxrwx 1 root root 15 Jun 16 04:19 /mnt/rootfs/lib64/libtinfo.so.5 -> libtinfo.so.5.7 [root@docker-host ~]# ls -al /mnt/rootfs/lib64/libtinfo.so.5.7
- rwxr-xr-x 1 root root 135896 Aug 19 2010 /mnt/rootfs/lib64/libtinfo.so.5.7
むむむ。。
ちなみにこれがホスト環境側のファイル。
[root@docker-host ~]# cat -A /lib64/libtinfo.so.5.7 | head -n1 | cut -b1-120 ^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^C^@>^@^A^@^@^@@M-H@C0^@^@^@@^@^@^@^@^@^@^@M-(^T^B^@^@^@^@^@^@^@^@^@@^@8^@^F^@@^@^^^@^]^@^A
ELFヘッダも確認できる正常なファイル。
ということで、dockerの中のファイルが壊れてしまったことは確認できたのだがこれ以上どうしようもないようだ。