Docker cpio: 'cap_set_file' 的临时解决方法

目前从 Docker 在 GitHub 上的 Issue #6980 cap_set_file not permitted on aufs storage driver only 来看,似乎只有 Ubuntu 14.04 LTS 上会重现这个问题。

解决方法是:

更换 Docker 的 Storage driver,里面 @Thorndike 提到更换成 devicemapper 驱动即可,但是很不幸的在我的机器上跑不了,错误信息如下:

1
Udev sync is not supported. This will lead to unexpected behavior, data loss and errors. For more information, see https://docs.docker.com/reference/commandline/cli/#daemon-storage-driver-option

然而 https://docs.docker.com/reference/commandline/cli/#daemon-storage-driver-option 并没有给出任何有用的信息,还是在 GitHub 上找到了答案

/var/lib/docker/trust/official.json 删掉,然后重启 docker 即可。

嗯,然而对 docker 1.7.0 并不起作用,只能降级到 1.6.2。

可惜我对 devicemapper 曾经在 docker 0.x 时代搞到 kernel panic 这件事儿仍然心有余悸,所以换成了 overlay 驱动。

由于 Trusty 的内核并不支持 overlay,需要首先升级到 Vivid 的内核:

1
2
3
sudo add-apt-repository ppa:canonical-kernel-team/ppa
sudo apt-get update
sudo apt-get install linux-headers-generic-lts-vivid linux-image-generic-lts-vivid

然后重启使内核生效

1
sudo reboot

修改 Docker 的 storage driver,在 /etc/default/docker 里加一行:

1
DOCKER_OPTS="$DOCKER_OPTS --storage-driver=overlay"

然后重启 docker

1
sudo service docker restart

重启后执行 docker info 即可看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
Containers: 1
Images: 19
Storage Driver: overlay
Backing Filesystem: extfs
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.19.0-22-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 16
Total Memory: 47.16 GiB
Name: ci
Registry: https://index.docker.io/v1/
WARNING: No swap limit support

嗯,已经生效啦。再 build 就不会遇到 cap_set_file not permitted 了。

–EOF–