Docker 服务在 ZFS 之前启动

Docker 服务在 ZFS 之前启动

我在 Ubuntu 16.04 上使用 Docker CE,使用 ZFS 作为 Docker 的存储。设置基本都是标准的:

  1. 有一个包含多个磁盘的 zpool
  2. 在 zpool 上,有一个带有 mountpoint 的 zfs 文件系统/var/lib/docker
  3. Docker 发现文件系统是 ZFS,并自动使用它

大部分情况下一切都正常。但是,偶尔当我的虚拟机启动时,zpool 无法挂载。我相信(虽然我不是 100% 确定)这是因为 Docker 服务在挂载 ZFS 文件系统之前启动,事实上我看到/var/lib/docker在根 FS 上创建了一个文件夹。

如何确保在所有 ZFS 文件系统都挂载后 Docker 服务才会启动?

答案1

我通过做两件事解决了这个问题。请注意,仅做一件事可能就足够了。

{"storage-driver": "zfs"}首先,通过在文件中写入明确告诉 Docker 使用 ZFS 作为文件系统/etc/docker/daemon.json。(如果该文件存在于您的磁盘中,则只需添加存储驱动程序密钥)

其次,在文件中创建以下 systemd 单元/etc/systemd/system/docker-wait-zfs.service

[Unit]
Description=Wait for ZFS before starting Docker
RequiredBy=docker.service
Before=docker.service
Requires=zfs.target
After=zfs.target

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然后执行:

systemctl enable docker-wait-zfs.service

答案2

在最近的更新后,这里的答案对我不起作用。除非根驱动器使用 ZFS,否则似乎“/etc/docker/daemon.json”中不能再有“{"storage-driver": "zfs"}”。这不适用于我,因为我只是将文件夹映射到恰好位于 ZFS 上的容器。

为了修复这个问题,可以采取以下措施:

  1. sudo systemctl 编辑 docker.service
  2. 添加以下内容:

    After=zfs-mount.service Requires=zfs-mount.service Wants=zfs-mount.service BindsTo=zfs-mount.service

答案这里,包含每行功能的解释。

相关内容