# 因为手贱引发的Docker灾难

**URL:** https://forum.magentochina.org/t/%E5%9B%A0%E4%B8%BA%E6%89%8B%E8%B4%B1%E5%BC%95%E5%8F%91%E7%9A%84docker%E7%81%BE%E9%9A%BE/991
**Category:** 提问
**Tags:** error, docker
**Created:** [2022 年7 月 4 日 05:54 UTC](https://forum.magentochina.org/t/%E5%9B%A0%E4%B8%BA%E6%89%8B%E8%B4%B1%E5%BC%95%E5%8F%91%E7%9A%84docker%E7%81%BE%E9%9A%BE/991 "2022-07-04T05:54:08Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### 作者： ![Shuai](https://forum.magentochina.org/user_avatar/forum.magentochina.org/shuai/32/3_2.png) [@Shuai](https://forum.magentochina.org/u/Shuai)
#### 发布日期： [2022 年7 月 4 日 05:54 UTC](https://forum.magentochina.org/t/%E5%9B%A0%E4%B8%BA%E6%89%8B%E8%B4%B1%E5%BC%95%E5%8F%91%E7%9A%84docker%E7%81%BE%E9%9A%BE/991/1 "2022-07-04T05:54:08Z")

</div>

> 早上发现某业务不能正常打开，随后登上服务器查看。发现是硬盘满了导致的，由于这是第二次发生这种事了，所以准备增加存储用于解决该问题。  
> 由于资源的原因，不能直接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` 参数用于解决该问题
