O serviço Docker começa antes do ZFS

O serviço Docker começa antes do ZFS

Estou usando o Docker CE no Ubuntu 16.04, com ZFS como armazenamento para Docker. A configuração é praticamente padrão:

  1. Há um zpool que possui vários discos
  2. No zpool, há um sistema de arquivos zfs com mountpoint /var/lib/docker.
  3. Docker vê que o sistema de arquivos é ZFS e usa isso automaticamente

Tudo funciona na maior parte do tempo. No entanto, de vez em quando, quando minha VM é inicializada, o zpool falha na montagem. Acredito (embora não tenha 100% de certeza) que isso ocorre porque o serviço Docker é iniciado antes da montagem do sistema de arquivos ZFS e, na verdade, vejo uma /var/lib/dockerpasta criada no FS raiz.

Como posso garantir que o serviço Docker não seja iniciado até que todos os sistemas de arquivos ZFS sejam montados?

Responder1

Consegui resolver isso fazendo duas coisas. Observe que apenas um pode ser suficiente.

Primeiro, diga explicitamente ao Docker para usar o ZFS como sistema de arquivos, escrevendo {"storage-driver": "zfs"}no arquivo /etc/docker/daemon.json. (Se o arquivo existir em seu disco, basta adicionar a chave do driver de armazenamento)

Segundo, crie a seguinte unidade systemd no arquivo /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

Em seguida, execute:

systemctl enable docker-wait-zfs.service

Responder2

A resposta aqui não funcionou para mim após uma atualização recente. Parece que você não pode mais ter "{"storage-driver": "zfs"}" em seu "/etc/docker/daemon.json", a menos que a unidade raiz esteja usando ZFS. Isso não se aplicava a mim, pois eu estava apenas mapeando pastas para meus contêineres que residem no ZFS.

Para corrigir isso, funcionou o seguinte:

  1. sudo systemctl editar docker.service
  2. Adicione o seguinte conteúdo:

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

A respostaaqui, contém uma explicação sobre o que cada linha faz.

informação relacionada