背景:项目需要,需要对 Docker 的存储目录进行迁移。
迁移的步骤大致如下:
1、停 docker 服务;
2、修改 docker 配置;
这里直接修改的 /etc/docker/daemon.json
,在其中添加:
1 | { |
3、迁移原数据目录到新目录下;
4、重启 docker 服务;
一般来说,经过以上 4 步,之前的 docker 服务都能继续正常运行。
问题
项目中有些是使用 docker-compose 进行管理的,其中就包括 ELK。
发现在目录迁移后,ELK 的服务无法正常启动:
其中,elasticsearch 报错信息如下:
logstash 的报错信息:
解决过程
网上进行了一些检索。
有人提到,尝试重新导入镜像。
该方法在前几个环境,均能解决问题。
但是在一些环境,不管怎么导,都无法解决问题。
我们尝试了目录的回退。
发现回退后,服务又可以正常运行。
很明显,是目录迁移后,权限发生了变化。
那么问题到底出在哪里呢?
我找出了操作步骤,其中迁移目录的命令是:
1 | cp -R /var/lib/docker /home/data/ |
-R
是什么含义呢?
查阅 cp
命令的帮助文档:
发现 -R
是递归的含义,也就是说会进行递归复制。
但是复制后的文件权限有办法保证吗?
我们发现了 -p
参数:
它可以保留源文件的属性。
解决方法
将之前拷贝的目录进行备份(或者直接删除),重新拷贝源 docker 数据目录到新的目录下。
这次使用命令:
1 | cp -rp /var/lib/docker /home/data/ |
再重启 docker。
再去观察 ELK 服务的状态:
一切恢复正常。
参考: