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

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

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

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

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

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

решение1

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

Во-первых, явно укажите Docker использовать ZFS в качестве файловой системы, записав {"storage-driver": "zfs"}в файл /etc/docker/daemon.json. (Если файл существует на вашем диске, то просто добавьте ключ storage-driver)

Во-вторых, создайте в файле следующий модуль 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

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

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

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

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

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

Связанный контент