Назад | Перейти на главную страницу

Служба Docker запускается до ZFS

Я использую Docker CE в Ubuntu 16.04 с ZFS в качестве хранилища для Docker. Настройка довольно стандартна:

  1. Есть zpool с несколькими дисками
  2. В zpool есть файловая система zfs с точкой монтирования /var/lib/docker.
  3. Докер видит, что файловая система - это ZFS, и использует это автоматически.

Большую часть времени все работает. Однако время от времени, когда моя виртуальная машина загружается, zpool не может смонтировать. Я считаю (хотя я не уверен на 100%), что это связано с тем, что служба Docker запускается до того, как файловая система ZFS смонтирована, и на самом деле я вижу /var/lib/docker папка, созданная в корне ФС.

Как я могу гарантировать, что служба Docker не запустится, пока не будут смонтированы все файловые системы ZFS?

Я смог решить эту проблему, выполнив две вещи. Обратите внимание, что одного может быть достаточно.

Во-первых, явно укажите Docker использовать ZFS в качестве файловой системы, написав {"storage-driver": "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

Ответ здесь не сработал для меня после недавнего обновления. Кажется, у вас больше не может быть "{" storage-driver ":" zfs "}" в вашем "/etc/docker/daemon.json", если только корневой диск не использует ZFS. Это было неприменимо ко мне, поскольку я просто сопоставлял папки с моими контейнерами, которые находятся в ZFS.

Чтобы исправить это, сработало следующее:

  1. sudo systemctl редактировать docker.service
  2. Добавьте следующее содержимое:

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

Ответ Вот, содержит объяснение того, что делает каждая строка.