因为手贱引发的Docker灾难

早上发现某业务不能正常打开,随后登上服务器查看。发现是硬盘满了导致的,由于这是第二次发生这种事了,所以准备增加存储用于解决该问题。
由于资源的原因,不能直接resize该虚拟机的存储,随后挂载了一个新的存储,并挂载到了 /data/ 目录下. 下面开始故障重现

迁移 /var/lib/docker

由于docker大部分信息都是存放在这个目录下,所以我需要把该目录迁移至 /data/

  1. 首先停止docker运行: systemctl stop docker
  2. 复制文件: cp -r /var/lib/docker /data/docker
  3. 删除文件: rm -rf /var/lib/docker
  4. 创建软连接: ln -s /data/docker /var/lib/docker

重启 docker

  1. systemctl start docker
  2. 查看容器是否启动成功: docker ps

故障

  • 发现容器虽然启动成功,但是页面500错误,根本打不开
  • docker logs CID
  • 通过docker logs命令发现容器报某文件无法写入,psql无法正常启动。

排错

  • 由于我是用软连接进行连接的,理论上和之前没有区别的,也不需要修改docker配置文件
  • 但是既然报错,我也就急需修改了docker的启动目录,修改为了 /data/docker ,然后发现依然不能正常启动
  • 根据 不能写入 的报错,直觉上认为会是权限问题。 所以无脑给了 持久化文件和docker相关文件 755权限
  • 依然是报错,后续持续了几个小时的排查问题,各种配置/各种权限, 依然无法解决问题

解决

  • 最后发现在进入容器之后,全是root用户和组。马上意识到了是容器内部权限不对。
  • 但是不清楚为什么会造成这个问题,但是docker本身容器就是非常久化的。所以在做好备份之后,直接重建容器系统环境,用于解决这个问题。
  • 移除所有容器和镜像文件之后,直接重建系统。
  • 在重建系统过程中发现有报错提示,提醒pg某个文件夹的权限不对,应该是700
  • 修改该文件夹为700权限,急需重建
  • 成功

原因

由于不是第一次被cp命令坑了,所以也是写这个这个文章的原因之一。
cp是我们日常最常用的命令之一,个人日常直接使用 cp -r. 意思就是直接递归目录复制
但是这里犯了错,该命令并没有复制文件的目录属性和权限
所以建议以后使用cp命令时,如权限可能会比较复杂的情况,例如docker这种虚拟机,应该使用 cp -r -p 该命令会保持复制目录的权限一致性
除了 -p 参数,还可以使用 -a 参数用于解决该问题