Várias coisas acontecendo aqui:
Primeiro,
docker commit
é um cheiro de código. Ele tende a ser usado por aqueles que criam imagens com um processo manual, em vez de automatizar suas compilações com um Dockerfile que permitiria uma recriação fácil. Se possível, recomendo que você faça a transição para um Dockerfile para a criação de sua imagem. Em seguida, um
docker commit
não capturará as alterações feitas em um volume. E esse mesmo problema ocorre se você tentar atualizar um volume com um RUN
passo em um Dockerfile. Ambos capturam alterações no sistema de arquivos do contêiner e armazenam essas alterações como uma camada na imagem do docker, e os volumes não fazem parte do sistema de arquivos do contêiner. Isso também é visível se você executar docker diff
contra um recipiente. Nesse caso, a imagem upstream definiu o volume em seu Dockerfile:VOLUME /var/lib/mysql
E o docker não possui um comando para desfazer um volume criado a partir do Dockerfile. Você precisaria modificar diretamente a definição da imagem de fora da janela de encaixe (não recomendado) ou criar sua própria imagem upstream com essa etapa removida (recomendado).
O que a imagem mysql fornece é a capacidade de injetar seus próprios scripts de criação de banco de dados em
/docker-entrypoint-initdb.d
, que você pode adicionar com sua própria imagem que estende o mysql ou montar como um volume. É aqui que você injetaria seu esquema ou inicializaria a partir de um backup conhecido para desenvolvimento. Por fim, se o objetivo é ter persistência, você deve armazenar seus dados em um volume, não fazendo commit de containers:
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
O volume permite que você recrie o contêiner, atualize para uma versão mais recente do mysql quando os patches forem lançados (por exemplo, correções de segurança) sem perder seus dados.
Para fazer backup do volume, isso será exportado para um tgz:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
E para restaurar um volume, isso cria um a partir de um tgz:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz