Aquí pasan varias cosas:
Primero, docker commit
es un olor a código. Suele ser utilizado por aquellos que crean imágenes con un proceso manual, en lugar de automatizar sus compilaciones con un Dockerfile que permitiría una fácil recreación. Si es posible, le recomiendo que haga la transición a un Dockerfile para la creación de su imagen.
A continuación, una docker commit
no capturará los cambios realizados en un volumen. Y este mismo problema ocurre si intenta actualizar un volumen con RUN
paso en un Dockerfile. Ambos capturan los cambios en el sistema de archivos del contenedor y los almacenan como una capa en la imagen de la ventana acoplable, y los volúmenes no forman parte del sistema de archivos del contenedor. Esto también es visible si ejecuta docker diff
contra un contenedor. En este caso, la imagen ascendente ha definido el volumen en su Dockerfile:
VOLUME /var/lib/mysql
Y Docker no tiene un comando para deshacer un volumen creado desde Dockerfile. Debería modificar directamente la definición de la imagen desde fuera de la ventana acoplable (no recomendado) o crear su propia imagen ascendente sin ese paso (recomendado).
Lo que proporciona la imagen mysql es la capacidad de inyectar sus propios scripts de creación de bases de datos en /docker-entrypoint-initdb.d
, que puede agregar con su propia imagen que se extiende mysql, o montar como un volumen. Aquí es donde inyectaría su esquema o lo inicializaría desde una copia de seguridad conocida para el desarrollo.
Por último, si el objetivo es tener persistencia, debe almacenar sus datos en un volumen, no mediante contenedores de confirmación:
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
El volumen le permite recrear el contenedor, actualizar a una versión más nueva de mysql cuando se lanzan parches (por ejemplo, correcciones de seguridad) sin perder sus datos.
Para hacer una copia de seguridad del volumen, esto se exportará a un tgz:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
Y para restaurar un volumen, esto crea uno a partir de un tgz:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz