docker load镜像时发生:open /xxx/xxx: invalid argument 问题解决
问题背景
由于要将一台服务器上的容器迁移到另一台服务器上,于是我们采用了docker commit
和docker save
命令将容器打包成tar包,然后将tar包传输到另一台服务器,然后docker load
这个镜像。
在docker load
时出现open /var/lib/dpkg/info/gcc-10-base:amd64.list: invalid argument
错误。
Docker环境
我们的运行环境是Ubuntu 22.04 LTS。由于担心本机的存储空间不够,我们将Docker的容器存储位置修改到了一个挂载了的新加卷上,测试了可以正常运行hello-world容器。
该新加卷的文件系统是NTFS。(这也是我们为什么docker load出错误的原因)。
问题分析
当我把docker 容器的存储路径切换回原始路径后,在命令行运行docker info
时,会出现以下输出:
Storage Driver: overlay2
Backing Filesystem: extfs
...
Docker Root Dir: /var/lib/docker
可以看到的当前docker
使用的storage driver
是overlay2
。此外,还有一个Backing Filesystem
它是指你Docker Root Dir
所在磁盘的文件系统,我的是extfs。你能够使用的storage driver是与你主机上的Backing Filesystem有关的。
对照关系如下图所示:
Storage driver | Supported backing filesystems |
---|---|
overlay2, overlay | xfs with ftype=1, ext4 |
而当我们将容器存储路径改到文件系统为NTFS的新加卷时,再执行docker info
,得到了以下输出:
Storage Driver: vfs
...
Docker Root Dir: /media/dell/xxxx/docker
发现Storage Driver
变成了vfs
,而且没有Backing Filesystem
。所以我们的解决方案就是将新加卷的文件系统改为xfs
。
问题解决
备份磁盘
参考 https://www.cnblogs.com/CarryBlogs/p/12629435.html 这篇文章对磁盘进行备份。具体步骤如下:
# 进入该磁盘的上一级目录,进行压缩
# 注意本机的剩余空间是否足够包含压缩后的tar文件,如果不行,要换一个路径
tar cvpzf backup.tgz /media/dell/xxxx
注意:不要使用复制粘贴来备份磁盘内的文件,会出现一些文件不可复制的情况,不确定性更大。建议直接使用压缩和解压缩来备份文件。
对移动硬盘进行格式化、挂载操作
参考这篇文章 https://zhuanlan.zhihu.com/p/397440213 对移动硬盘进行格式化、挂载等操作,其中格式化硬盘,并写入文件系统
部分使用mkfs.xfs
命令。
对磁盘内容进行还原
进入挂载磁盘的目录,将tar复制/剪贴到这里,然后进行解压
sudo tar xvpfz backup.tgz
sudo mv xxxx/* .