
Я использую Docker CE на Ubuntu 16.04 с ZFS в качестве хранилища для Docker. Настройка довольно стандартная:
- Есть zpool с несколькими дисками
- В zpool имеется файловая система zfs с точкой монтирования
/var/lib/docker
. - 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.
Чтобы исправить это, сработало следующее:
- sudo systemctl edit docker.service
Добавьте следующее содержимое:
After=zfs-mount.service Requires=zfs-mount.service Wants=zfs-mount.service BindsTo=zfs-mount.service
Ответздесь, содержит объяснение того, что делает каждая строка.