Probleem: bij het afsluiten van een Ubuntu-server met Docker-containers hangt de machine, en de console loopt vol met Memory cgroup out of memory en Killed process ... (python3).

Oorzaak: in /etc/docker/daemon.json stond "live-restore": true. Daarmee laat Docker de containers doordraaien als de Docker-daemon zelf stopt. Bij het afsluiten koppelt systemd vervolgens de NFS-share los terwijl de apps nog draaien. In de laatste fase van het afsluiten herstarten de apps zichzelf (bijvoorbeeld via s6 in linuxserver-images), en dat geeft de OOM-meldingen en het hangen.

Oplossing:

  1. Zet live-restore uit:

    { "live-restore": false }
  2. Laat Docker pas stoppen voordat de NFS-share wordt losgekoppeld, met een drop-in /etc/systemd/system/docker.service.d/nfs-order.conf:

    [Unit]
    After=remote-fs.target mnt-nas-Data.mount
    Wants=remote-fs.target
  3. Toepassen zonder de containers te herstarten:

    sudo systemctl daemon-reload
    sudo systemctl reload docker
    docker info | grep -i "live restore"   # moet false tonen

Resultaat: de containers stoppen netjes in een paar seconden, daarna pas wordt de NAS losgekoppeld, en de server is in ongeveer 20 seconden uit.

Wanneer wél live-restore?

Live-restore is handig als je de Docker-daemon wilt updaten zonder dat containers stoppen. Op een thuisserver met NFS-mounts levert het vooral problemen op bij het afsluiten.