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