Meine Lösung besteht darin, das neue docker cp
zu verwenden, das jetzt in der Lage ist, Daten aus Containern zu kopieren, unabhhängig davon, ob sie ausgeführt werden oder nicht, und ein Host-Volume für den genau gleichen Ort freizugeben, an dem die Datenbankanwendung ihre Datenbankdateien im Container erstellt. Diese doppelte Lösung funktioniert ohne einen Datencontainer, direkt aus dem Original-Datenbankcontainer heraus.
Also übernimmt mein systemd-Init-Skript die Aufgabe, die Datenbank in ein Archiv auf dem Host zu sichern. Ich habe einen Zeitstempel in den Dateinamen eingefügt, um nie eine Datei zu überschreiben.
Es erfolgt im ExecStartPre:
ExecStartPre=-/usr/bin/docker cp lanti-debian-mariadb:/var/lib/mysql /home/core/sql
ExecStartPre=-/bin/bash -c '/usr/bin/tar -zcvf /home/core/sql/sqlbackup_$$(date +%%Y-%%m-%%d_%%H-%%M-%%S)_ExecStartPre.tar.gz /home/core/sql/mysql --remove-files'
Und dasselbe passiert auch im ExecStopPost:
ExecStopPost=-/usr/bin/docker cp lanti-debian-mariadb:/var/lib/mysql /home/core/sql
ExecStopPost=-/bin/bash -c 'tar -zcvf /home/core/sql/sqlbackup_$$(date +%%Y-%%m-%%d_%%H-%%M-%%S)_ExecStopPost.tar.gz /home/core/sql/mysql --remove-files'
Außerdem habe ich einen Ordner vom Host als Volume freigegeben, um genau am gleichen Ort, an dem die Datenbank gespeichert ist:
mariadb:
build: ./mariadb
volumes:
- $HOME/server/mysql/:/var/lib/mysql/:rw
Es funktioniert großartig auf meinem VM (ich erstelle einen LEMP-Stack für mich selbst): https://github.com/DJviolin/LEMP
Aber ich weiß einfach nicht, ob es eine "bulletproof" Lösung ist, wenn Ihr Leben davon abhängt (zum Beispiel ein Webshop mit Transaktionen in möglichen Millisekunden)?
Bei 20 min 20 Sek ab diesem offiziellen Docker-Keynote-Video macht der Moderator dasselbe mit der Datenbank:
Erste Schritte mit Docker
"Für die Datenbank haben wir ein Volume, damit wir sicherstellen können, dass wir, wenn der Datenbankcontainer gestoppt wird, keine Daten verlieren, wenn die Datenbank heruntergefahren wird."