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 /mnt/rootfs/lib64/libtinfo.so.5.7 | head -n1 | cut -b1-120 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

むむむ。。

ちなみにこれがホスト環境側のファイル。

[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の中のファイルが壊れてしまったことは確認できたのだがこれ以上どうしようもないようだ。