Centos7默认xfs文件系统与docker默认overlay2存储驱动不匹配,会导致容器内文件无法删除等问题

这事害人不浅,应该很多人都会碰到啊,为什么没看到铺天盖地的抱怨?

问题表现

docker build的时候发现rm -rf 报错,说文件夹非空。 我都-f了怎么还不空呢,run进去rm -f一把,发现挺不对劲的。rm 文件后,再ls -l 发现文件还在,属性都变 ???? 了,所以rm -r删不了文件夹。cat等命令操作文件吧,又说文件不存在。搜吧,docker删不了文件,有没找到直接的答案。

按理说docker里面删除文件,文件不是同层创建的话,上一层带来的文件不会真正删除,但应该打标记,不在容器内体现才对。这事看起来像docker文件系统的问题,一搜发现docker还有好几套文件驱动支持。 于是docker info看看我这是啥。

# docker info
Containers: 25
 Running: 6
 Paused: 0
 Stopped: 19
Images: 13
Server Version: 18.03.1-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: false
 Native Overlay Diff: false
Logging Driver: json-file

嗯,是overlay2,再往下看

WARNING: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorrect behavior.
         Reformat the filesystem with ftype=1 to enable d_type support.
         Running without d_type support will not be supported in future releases.
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

这我就有点想问候下docker它妈了。你都知道xfs文件系统格式化没有带d_type支持,会导致错误表现。那你还给运行起来?你不会换个文件驱动或者干脆不起来了也好啊。不出点事谁会来看这info,而且centos7默认就是xfs,又有几个人知道d_type是个啥会去搞这么个事。

问题解决

知道问题点后,还是能搜出点解决经验的。
https://blog.csdn.net/liukuan73/article/details/77986139
解决方案,备份,加参数重新格式化,恢复。
mkfs.xfs -n ftype=1 /path/to/your/device

额,这不好玩。docker换个文件驱动看起来会简单点。该systemd unit file, 加参数指定老的devicemapper试试。

# vi /etc/systemd/system/multi-user.target.wants/docker.service
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper

# systemctl restart docker

满怀期待的重新docker build,底包找不到了,docker images 一看,空了,我去。

所以,格式化硬盘还是重新下你的docker images, 你得选一个。
但愿我的devicemapper + xfs不会再出点什么幺蛾子。

你可能感兴趣的:(走过的坑)