Docker容器内文件无法删除


千里之行,始于足下

Docker容器内文件无法删除


  • 早上同事在群里反馈,说上 CentOS7 运行的 docker 无法使用了。经过排除,发现是因为容器中的文件无法删除导致,服务启动失败的,折腾了很久都没有发现问题处理哪里。很奇怪,docker 也重装了问题还是出现。

Docker容器内文件无法删除

  • 按理说 docker 里面删除文件,文件不是同层创建的话,上一层带来的文件不会真正删除,但应该打标记,不在容器内体现才对。这事看起来像 docker 文件系统的问题,一搜发现 docker 还有好几套文件驱动支持,于是 docker info 看看我们的操作都支持什么驱动。
# docker info
......
WARNING: overlay: 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.
  • 发现 Centos7 默认使用的是 xfs 文件系统,与 docker 默认 overlay2 存储驱动不匹配。因为是 WARNING ,所以可能会导致容器内文件无法删除等问题。
[escape@localhost ~]$ cat /etc/fstab
#
# /etc/fstab
#
/dev/mapper/root         /        xfs     defaults     0 0
UUID=1d82-xxx-a6d5-1245  /boot    xfs     defaults     0 0
/dev/mapper/home         /home    xfs     defaults     0 0
/dev/mapper/swap         swap     swap    defaults     0 0
/dev/sdb1                /data    ext4     defaults    0 0
  • [1] 格式化磁盘
  • 既然已经发现了问题,那么就要开始接近问题。最最直接且彻底的方式就是,重新格式化磁盘,使用 Ext4 格式。
# 磁盘分区
$ fdisk /dev/sdb1

# 格式化磁盘
$ mkfs.ext4 /dev/sdb1

# 挂载
$ mount /dev/sdb1 /data
  • [2] 更改文件驱动
  • CentOS7 中,我们还可以更改文件驱动,这个看起来更加简单一点,加参数指定老的 devicemapper 驱动,即 devicemapper + xfs 的方式运行。
# 修改文件驱动
$ vi /etc/systemd/system/multi-user.target.wants/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper
ExecReload=/bin/kill -s HUP $MAINPID
...

# 重启docker服务
$ systemctl restart docker
  • [3] 宿主机中删除文件
  • 因为是 dockerCentOS7 下的一个 Bug 导致文件系统里边的文件不会被删除,所以我们使用临时方法从宿主机上直接删除。在宿主机上 LowerDir 目录下,删除对应的报错的文件或者文件夹(``),即可。
# 查看容器信息
$ inspect container_name
"GraphDriver": {
    "Data": {
        "LowerDir": "/var/lib/docker/overlay/xxx6aee/root",
        "MergedDir": "/var/lib/docker/overlay/xxxe6a/merged",
        "UpperDir": "/var/lib/docker/overlay/xxxfe6a/upper",
        "WorkDir": "/var/lib/docker/overlay/xxxde96a/work"
    },

# 删除文件夹
$ rm -rf /var/lib/docker/overlay/xxx6aee/root/usr/local/lib/python2.7/dist-packages/pyparsing

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !