El servicio Docker comienza antes que ZFS

El servicio Docker comienza antes que ZFS

Estoy usando Docker CE en Ubuntu 16.04, con ZFS como almacenamiento para Docker. La configuración es prácticamente estándar:

  1. Hay un zpool que tiene varios discos.
  2. En zpool, hay un sistema de archivos zfs con punto de montaje /var/lib/docker.
  3. Docker ve que el sistema de archivos es ZFS y lo usa automáticamente

Todo funciona la mayor parte del tiempo. Sin embargo, de vez en cuando, cuando mi máquina virtual arranca, zpool no se puede montar. Creo (aunque no estoy 100% seguro) que esto se debe a que el servicio Docker se inicia antes de que se monte el sistema de archivos ZFS y, de hecho, veo una /var/lib/dockercarpeta creada en el FS raíz.

¿Cómo puedo asegurarme de que el servicio Docker no se inicie hasta que todos los sistemas de archivos ZFS estén montados?

Respuesta1

Pude resolver esto haciendo dos cosas. Tenga en cuenta que uno solo podría ser suficiente.

Primero, indique explícitamente a Docker que use ZFS como sistema de archivos, escribiendo {"storage-driver": "zfs"}en el archivo /etc/docker/daemon.json. (Si el archivo existe en su disco, simplemente agregue la clave del controlador de almacenamiento)

En segundo lugar, cree la siguiente unidad systemd en el archivo /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

Luego ejecuta:

systemctl enable docker-wait-zfs.service

Respuesta2

La respuesta aquí no funcionó para mí después de una actualización reciente. Parece que ya no puede tener "{"storage-driver": "zfs"}" en su "/etc/docker/daemon.json", a menos que la unidad raíz esté usando ZFS. Esto no era aplicable a mí, ya que solo estaba asignando carpetas a mis contenedores que residen en ZFS.

Para solucionar este problema, funcionó lo siguiente:

  1. sudo systemctl editar docker.servicio
  2. Agregue los siguientes contenidos:

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

La respuestaaquí, contiene una explicación de lo que hace cada línea.

información relacionada