overlay2でレイヤ数が多くてdocker checkpointに失敗するとき

Docker 1.13.0ではexperimentalにdocker checkpointが使えます。この機能を使うにはバージョン2.0以上のcriuコマンドが必要ですがCentOS 7 1511のcriuのバージョンは1.6.1なのでこの条件を満たしていません。CentOS 7 1611はまだリリースされていないため http://buildlogs.centos.org/c7.1611.00/criu/20161105151332/2.3-2.el7.x86_64/ にあるcriuのRPMパッケージとこれが要求するRPMパッケージを拝借しました。

まず https://criu.org/Docker にあるlooperと名付けられたコンテナでcheckpointを試したところ問題なく checkpoint/start できました。次に [jupyter/minimal-notebook](https://hub.docker.com/r/jupyter/minimal-notebook/) コンテナの checkpoint を試したところエラーが発生しました。

```bash
$ docker run -d -v $HOME/work:/home/jovyan/work --name jupyter-criutest --security-opt seccomp:unconfined jupyter/minimal-notebook:bde52ed89463
8db2c747f69f6f31243d096d646b3c5dd22b7bc116d1ec73d464ca81d286d928
$ docker checkpoint create jupyter-criutest chkp1
Error response from daemon: Cannot checkpoint container jupyter-criutest: rpc error: code = 2 desc = exit status 1: "criu failed: type NOTIFY errno 0\nlog file: /var/lib/docker/containers/8db2c747f69f6f31243d096d646b3c5dd22b7bc116d1ec73d464ca81d286d928/checkpoints/chkp1/criu.work/dump.log\n"
```
dump.logファイルを見るとmountinfoを参照するところでエラーになっていました。

```bash:chkp1/criu.work/dump.logから抜粋
(00.012763)     type overlay source overlay mnt_id 278 s_dev 0x29 / @ ./ flags 0x200000 options lowerdir=/var/lib/docker/overlay2/l/EKV3W63OS43XTCXPOVRGVU7NEA:/var/lib/docker/overlay2/l/6J76737SN2PMJWNA4KK6IC4OBJ:/var/lib/docker/overlay2/l/YKWYVPDZGFJPCL4Q7PGYMTDFII:/var/lib/docker/overlay2/l/MHT7U7U6FNOPWZ3MBUQEFWRZKP:/var/lib/docker/overlay2/l/T7YMXVTUCFH6S5VLFODGDFWWC7:/var/lib/docker/overlay2/l/JX7546TYZ4CXFYUDZMFYGGZOGE:/var/lib/docker/overlay2/l/BCHSQIXMQYGGDB4AQLQMSCKH4P:/var/lib/docker/overlay2/l/QFK55IECTCMMTDLXJIYJAUACO3:/var/lib/docker/overlay2/l/HHBIIN2OZQP2AMSPLVDJQHDZHR:/var/lib/docker/overlay2/l/YQNRVHJI3Q6SB7XBLDSERKY7GX:/var/lib/docker/overlay2/l/RF2PBUHK5VGKMKGMM4YP3POSSR:/var/lib/docker/overlay2/l/W5SBLXWFONOXEQFZC3TK3BRAD6:/var/lib/docker/overlay2/l/G4G57JS7LLSLPWTLQ2DSAVEOVO:/var/lib/docker/overlay2/l/HO63J5GVQWB2FMXTDKSRCPPYLS:/var/lib/docker/overlay2/l/DL3ISEN6SV6VUUTFSRJBF6VXAA:/var/lib/docker/overlay2/l/64UU3KXQU3JWSMM5I2N5VANYUI:/var/lib/docker/overlay2/l/A7BYLNJMAWCIY7NLIHDTBPJGKL:/var/lib/docker/overlay2/l/OQFFDK2B62MMBARCJW3
(00.012812) Error (proc_parse.c:1393): Bad format in 58717 mountinfo: '4N2SW4J:/var/lib/docker/overlay2/l/5EAMF56OQMVR5NPYNCI4XMYYZN:/var/lib/docker/overlay2/l/RIVBKA3FYBG66JNIKJYS4BEFZC:/var/lib/docker/overlay2/l/YR2VLI3OUX4YFXDOHKQDUBSSTI,upperdir=/var/lib/docker/overlay2/469d9765ffadd80b250f2f6b222a3e906bae9004a46357f8c17c529a3603957b/diff,workdir=/var/lib/docker/overlay2/469d9765ffadd80b250f2f6b222a3e906bae9004a46357f8c17c529a3603957b/work
'
(00.012828) Error (mount.c:2033): mnt: Can't parse 58717's mountinfo
```
どうやらoverlay2のようにイメージレイヤ数が多くなるにつれてmount情報の文字列が長くなる場合に生じる問題のようです。

[TestCheckpoint fails on Docker overlay2 #1070](https://github.com/opencontainers/runc/issues/1070)

そして10月にリリースされたcriuのバージョン2.7でこの問題が修正されていました。

[proc_parse: use the static buffer to parse mountinfo](https://github.com/xemul/criu/commit/fb4f28f00af0f2d8c6fafdbafc74951f0caea925)

CentOS 7 1611の criu-2.3-2.el7 にこのパッチを当てたものと差し替えると無事 [jupyter/minimal-notebook](https://hub.docker.com/r/jupyter/minimal-notebook/) コンテナを checkpoint/start できました。