20200813: 如果某个 docker 容器需要挂载非 docker 目录的文件或目录时,该容器会失败,原因是对于挂载的目录没有访问权限,解决方法是新建一个共享目录放置挂载的文件,并设置该共享目录 everyone 用户有读写权限即可,注意这里可以设置 everyone 用户有读写权限,其他用户(比如 user1、user2)禁止访问。
群晖 docker 套件安装时会让用户选择存储空间位置(或者之前勾选了总是安装在某个存储空间),安装完成后会在该存储空间内新建一个名为 docker 的目录。猜测群晖官方的本意是让大家把 docker 要挂载的文件或者目录存放在 docker 目录即可,不需要重新设置用户权限;如果挂载其他位置的话需要赋予 docker 套件权限,因为可以看见官方新建的 docker 目录的权限是 everyone 都有可读权限。
了解了群晖官方的意图后,我循规蹈矩地使用了 docker 共享目录。但不巧的是,我安装 docker 套件和 docker 目录所在的机械硬盘太吵了,考虑到 docker 会一直在后台服务,就起了把它们挪到一块 SSD 硬盘上的打算。然后各种坑随之而来。
第一步当然是卸载 docker 套件了,但要保留 docker 目录,因为里面有我的 docker 配置信息和挂载文件,想当然地认为卸载后重新安装到新硬盘上,然后 docker 套件一看已经有存在于其他硬盘的 docker 目录了,那肯定会在新硬盘上新建一个类似于 docker1 的目录吧。
事实是群晖并没有新建 docker1 这种目录,然后我想那我帮你在新硬盘上新建一个就好了,然后设置一下权限,一样用的嘛。
第二步安装官方提供的 gitlab 套件,它是基于 docker 套件的,安装过程中我的机械硬盘又开始网传的炒豆子声音了,有些疑惑,并没有操作机械硬盘啊,这时候它应该是休眠状态啊。等安装完 gitlab 后,我发现原来的 docker 目录里多了一个 gitlab 目录,原来如此,群晖只认这个 docker 目录了。
下一步自然的想法是把 gitlab 删掉,同时 docker 目录里的 gitlab 也没了;然后我想这个 docker 目录必须是 docker 套件才能创建出来,那我先把现有的 docker 目录重命名一下,把 docker 套件卸载重装就好了。
由于 web 界面不提供 docker 目录重命名的操作,我连上 SSH 操起 root 权限大干一场,简单的 mv 命令嘛,然后一刷新页面,File Station 竟然没有识别重命名后的 docker_bak 目录,我猜肯定是 @eaDir 里面有问题,把 @eaDir 里面的 docker 目录也重命名了,还是不识别。
被逼无奈,我只好把 docker 目录里的东西剪贴出来,把这讨厌的 docker 目录直接删除了,但是突然发现为什么还有个 @docker 目录,进去看了看好像是 docker 套件的系统信息文件,那也一并删除了吧,竟然告诉我 btrfs 目录下的一些目录删不掉 “Operation not permitted”,强迫症犯了,这可如何是好。
无意间我顿悟了,如果让我来设计 docker 套件和 docker 目录,那肯定是卸载的时候可以把 docker 目录和 @docker 目录都清理干净的,试验了一下,果然英雄所见略同。卸载 docker 套件后重新安装它到机械硬盘,然后立马卸载并选择删除所有数据,这样机械硬盘就干净了。
最终解决思路:不需要 SSH 上去,首先把 docker 共享目录里的文件备份,其次卸载 docker 套件并勾选“删除映像、容器和 Docker 共享文件夹“选项,然后安装 docker 套件到新的存储空间,最后把备份的文件复制回新的 docker 共享目录即可。当然那些 image 映像需要重新下载了,或者提前导出再导入亦可。
