Mysql
 sql >> Datenbank >  >> RDS >> Mysql

docker commit mysql speichert nicht

Hier passieren mehrere Dinge:

Zuerst docker commit ist ein Codegeruch. Es wird in der Regel von denjenigen verwendet, die Images mit einem manuellen Prozess erstellen, anstatt ihre Builds mit einem Dockerfile zu automatisieren, das eine einfache Neuerstellung ermöglichen würde. Wenn irgend möglich, empfehle ich Ihnen, für Ihre Image-Erstellung auf eine Docker-Datei umzusteigen.

Als nächstes ein docker commit erfasst keine an einem Volume vorgenommenen Änderungen. Und dasselbe Problem tritt auf, wenn Sie versuchen, ein Volume mit einem RUN zu aktualisieren step in einer Dockerfile. Beide erfassen Änderungen am Container-Dateisystem und speichern diese Änderungen als Schicht im Docker-Image, und die Volumes sind nicht Teil des Container-Dateisystems. Dies ist auch sichtbar, wenn Sie docker diff ausführen gegen einen Behälter. In diesem Fall hat das Upstream-Image das Volume in seinem Dockerfile definiert:

VOLUME /var/lib/mysql

Und Docker hat keinen Befehl, um ein erstelltes Volume aus der Dockerfile rückgängig zu machen. Sie müssten die Bilddefinition entweder direkt außerhalb von Docker ändern (nicht empfohlen) oder Ihr eigenes Upstream-Bild erstellen, wobei dieser Schritt entfernt wird (empfohlen).

Was das mysql-Image bietet, ist die Möglichkeit, Ihre eigenen Skripts zur Datenbankerstellung in /docker-entrypoint-initdb.d einzufügen , die Sie mit Ihrem eigenen Image hinzufügen können, das mysql erweitert, oder als Volume bereitstellen. Hier würden Sie Ihr Schema einfügen oder von einem bekannten Backup für die Entwicklung initialisieren.

Wenn das Ziel Persistenz ist, sollten Sie schließlich Ihre Daten in einem Volume speichern, nicht indem Sie Container festschreiben:

docker run -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

Das Volume ermöglicht es Ihnen, den Container neu zu erstellen und auf eine neuere Version von MySQL zu aktualisieren, wenn Patches veröffentlicht werden (z. B. Sicherheitsfixes), ohne Ihre Daten zu verlieren.

Um das Volume zu sichern, wird dies in ein tgz exportiert:

docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz

Und um ein Volume wiederherzustellen, erstellt dies eines aus einem tgz:

docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz