Eu executo o MySQL em um contêiner docker:
sudo docker run --rm --name mysql5 --net legacy_net --net-alias mysql5 --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=$MROOTPASS -d mysql:5.7
mysql -u root -h 172.20.0.2 -p$MROOTPASS
e criou um banco de dados experimental com o seguinte comando:
CREATE DATABASE testdb;
e comprometeu o contêiner:
sudo docker commit mysql5 mysql:5.7-test
Quando iniciei o contêiner comprometido:
sudo docker stop mysql5;
sudo docker run --rm --name mysql5 --net legacy_net --net-alias mysql5 --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=$MROOTPASS -d mysql:5.7-test
meu banco de dados de teste desapareceu.
É um comportamento normal ou fiz algo errado?
Meu entendimento era que o Docker armazena seus dados em algum lugar em seu armazenamento interno que é copiado para a nova imagem quando eu faço isso docker commit
. O que eu entendi errado?
EDITAR1
sudo docker inspect mysql5 | grep -i volume
"VolumeDriver": "",
"VolumesFrom": null,
"Type": "volume",
"Source": "/var/lib/docker/volumes/1f04f07e91a16e6e9aeb393af2954dd7e32e2a2b93615fb4b6924de3568951af/_data",
"Volumes": {
sudo docker inspect mysql:5.7
"Volumes": {
"/var/lib/mysql": {}
},
EDITAR2
O Docker cria o volume com seu mysql
usuário que tem id=999:
sudo docker run --rm --name mysql5 -v /home/dmitriano/work/mysql:/var/lib/mysql --net legacy_net --net-alias mysql5 --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=$MROOTPASS -d mysql:5.7
ll
drwxr-xr-x 5 999 root 4096 Jan 20 19:31 mysql/
sudo docker exec -it mysql5 bash -c "id 999"
uid=999(mysql) gid=999(mysql) groups=999(mysql)
O que devo fazer com este 999 na máquina host?
Com base no seu comentário sobre redefinir o banco de dados para um estado adicional, fica claro o que você espera.
Você deseja configurar um banco de dados de teste dentro do contêiner MySQL e deseja redefinir o banco de dados após os testes.
Este
docker commit
não é o lugar certo para isso, porque o banco de dados não faz parte do contêiner, mas sim de um volume, que é definido no MySQL Dockerfile. Até que você crie sua própria imagem Docker sem essa diretiva, fazer commit desse contêiner não armazenará o banco de dados de teste.Há duas opções.
A opção 1 seria definir um volume nomeado e montar fe
/test
como/var/lib/mysql
dentro do contêiner em execução. Após a configuração inicial, você pode copiar essa pasta para um local salvo e, antes de executar o próximo ciclo de teste, copiá-la de volta para ´/test` etc. Rápido e sujo...A opção 2 é usar o processo de inicialização interna do docker do MySQL. Há uma pasta bem conhecida
/docker-entrypoint-initdb.d/
dentro do contêiner. Essa pasta está vazia por padrão, mas pode conter vários arquivos SQL para inicializar o banco de dados. Então, basta montar, por exemplo,/schema.sql
e/docker-entrypoint-initdb.d/schema.sql
pronto.Além disso, é claro, você também pode definir seu próprio contêiner MySQL com base na imagem pública do Docker MySQL e estender o Dockerfile COPIANDO esse arquivo de esquema para o local fornecido ou adicionando vários comandos RUN para criar uma imagem que já esteja totalmente definida.
Sua pergunta - o que está errado - você executa o contêiner com
docker run --rm
o qual remove o volume após pará-lo. Por favor, verifique se o local (com base no seu exemplo/var/lib/docker/volumes/1f04f07e91a16e6e9aeb393af...
) não deve estar mais presente apósdocker stop
.