Er gebeuren hier verschillende dingen:
Eerst, docker commit
is een codegeur. Het wordt meestal gebruikt door degenen die afbeeldingen maken met een handmatig proces, in plaats van hun builds te automatiseren met een Dockerfile die gemakkelijke recreatie mogelijk zou maken. Als het enigszins mogelijk is, raad ik je aan over te stappen naar een Dockerfile voor het maken van je afbeeldingen.
Vervolgens een docker commit
zal geen wijzigingen vastleggen die aan een volume zijn aangebracht. En hetzelfde probleem doet zich voor als u een volume probeert bij te werken met een RUN
stap in een Dockerfile. Beide nemen wijzigingen in het containerbestandssysteem op en slaan die wijzigingen op als een laag in de docker-image, en de volumes maken geen deel uit van het containerbestandssysteem. Dit is ook zichtbaar als u docker diff
. uitvoert tegen een container. In dit geval heeft de upstream-afbeelding het volume in hun Dockerfile gedefinieerd:
VOLUME /var/lib/mysql
En docker heeft geen commando om een aangemaakt volume ongedaan te maken uit de Dockerfile. U moet ofwel de afbeeldingsdefinitie rechtstreeks van buiten de docker wijzigen (niet aanbevolen) of uw eigen upstream-afbeelding bouwen waarbij die stap is verwijderd (aanbevolen).
Wat de mysql-afbeelding wel biedt, is de mogelijkheid om uw eigen scripts voor het maken van databases te injecteren in /docker-entrypoint-initdb.d
, die u kunt toevoegen met uw eigen afbeelding die mysql uitbreidt, of die u als een volume kunt koppelen. Dit is waar u uw schema zou injecteren, of zou initialiseren vanaf een bekende back-up voor ontwikkeling.
Ten slotte, als het doel is om persistentie te hebben, moet u uw gegevens in een volume opslaan, niet door containers te committen:
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
Met het volume kunt u de container opnieuw maken, upgraden naar een nieuwere versie van mysql wanneer patches worden uitgebracht (bijvoorbeeld beveiligingsoplossingen) zonder uw gegevens te verliezen.
Om een back-up van het volume te maken, wordt dit geëxporteerd naar een tgz:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
En om een volume te herstellen, maakt dit er een van een tgz:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz