我尝试将 Docker 配置、图像、容器等存储在外部存储中。按照本教程 https://www.howtogeek.com/devops/how-to-store-docker-images-and-containers-on-an-external-drive/
我已经创建了/etc/docker/daemon.json:
{
"data-root": "/media/user/MYUSB/docker-data"
}
但是当我插入我的 USB 存储(MYUSB)并启动 docker 服务时,这个服务失败了。
$ sudo service docker start
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
$ sudo dockerd --debug
INFO[2023-07-06T12:36:29.650356567+02:00] Starting up
could not create or set daemon root permissions: /media/user/MYUSB/docker-data: chown /media/user/MYUSB/docker-data: operation not permitted
如果我重新启动计算机,服务将创建一个新的干净的 MYSUB 文件夹来存储数据,并且系统将把我的实际 USB 存储挂载为 MYUSB1(而不是用它来存储 docker 数据)。
我的系统挂载了我的 usb 密钥,权限设置为 user:user,而不是 root:root,所以可能来自这里。但我觉得奇怪的是,docker 服务(我猜是 root 运行的)不能使用 user:user 存储。
如果我尝试使用 root 用户手动挂载 usb。我创建的 /media/user/MYUSB 文件夹设置为 root:root,直到我将 usb 挂载到其上:其所有者更改为 user:user。
我有点不安,因为似乎我是互联网上唯一遇到这个问题的人,尽管这似乎不是一个不寻常的配置。
答案1
通过尝试一些东西,我推断您的 USB 闪存驱动器具有 FAT32 或其他不支持 POSIX 权限的文件系统。您无法在 Docker 中使用这样的文件系统。但这还不是全部!
自动挂载的文件系统也不适合 Docker,因为它们是通过诺苏伊德和节点。Linux 根文件系统(Docker 镜像中常见的文件系统)无法正确放置在其上。您可以使用 进行检查mount | grep media
。(自动挂载通常使用udisks2这些日子。)
首先,你应该在闪存驱动器上放置一个适当的文件系统(例如ext4)。
然后你必须确保udisks2无法挂载文件系统(选项不合适,而且太迟了)。您可以使用udev使其忽略文件系统的规则:
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"
你应该把它放在一个名为的文件中/etc/udev/rules.d/99-ignore-my-usb.rules
。你可以使用 找到新创建的文件系统的文件系统 UUID blkid
。
然后,您将创建一个适当的条目/etc/fstab
(再次使用 UUID)以确保 USB 闪存驱动器足够早地安装。无需摆弄任何 Docker 配置,只需将其安装在/var/lib/docker
默认 Docker 数据目录中即可。如下所示:
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX /var/lib/docker ext4 relatime 0 0
要确保一切正常,只需重新启动。Docker 应启动并mount
确认闪存驱动器确实已安装在/var/lib/docker
。
这样,您的 Docker 闪存驱动器就可移植了。您不能在 PC 运行时直接将其移除。请先停止 Docker,然后卸载它,然后再将其移除。否则,您有文件系统损坏的风险,Docker 最终当然会崩溃。