2014-07-21 8 views
1

J'utilise une variante de la réponse fournie à cette question: How to deal with persistent storage (e.g. databases) in docker. En particulier, je rencontre des problèmes avec la procédure de sauvegarde/restauration. Voici l'histoire ...Impossible de sauvegarder le conteneur de stockage persistant pour le conteneur docker MariaDB

J'ai créé une image simple à utiliser comme un conteneur. Le Dockerfile ressemble à ceci:

FROM busybox 

VOLUME /var/lib/mysql 

CMD /bin/sh 

J'ai créé un conteneur à partir de cette image avec les commandes suivantes:

docker build -t myimages/datastore . 

docker run --name mysql_data myimages/datastore true 

Alors je construit l'image tutum/mariadb et créé un conteneur:

docker run -d -p 3306:3306 --volumes-from mysql_data tutum/mariadb 

Tout fonctionne bien. Je peux me connecter à la base de données en utilisant le client mysql et effectuer des opérations de base de données. Spécifiquement, j'ai fait ceci: create database testdb; et create table testtbl select 1 as 'id', 'hello' as 'word';.

Ensuite, j'ai tenté de sauvegarder mon conteneur. À la suite de la réponse à la question ci-dessus (avec quelques modifications), je l'ai fait:

docker run --rm --volumes-from mysql_data -v $(pwd):/backup busybox \ 
    tar cvf /backup/backup.tar /var/lib/mysql 

Et le tour est joué ! J'avais un fichier backup.tar dans mon dossier de sauvegarde sur l'hôte.

Donc, comme une dernière étape, j'ai essayé de restaurer la sauvegarde avec la série de commandes suivantes:

docker run --name mysql_data2 myimages/datastore true 

docker run --rm --volumes-from mysql_data2 -v $(pwd):/backup busybox \ 
    tar xvf /backup/backup.tar -C /var/lib/mysql/ 

Et j'ai créé un nouveau conteneur MariaDB qui a importé des volumes du nouveau conteneur de données:

docker run -d -p 3308:3306 --volumes-from mysql_data2 tutum/mariadb 

Le nouveau conteneur de base de données a démarré très bien, je me suis connecté avec le client mysql et j'ai vérifié la base de données. Voici où le problème est survenu: au lieu d'avoir une base de données testdb (comme créé ci-dessus), j'ai une base de données var; et au lieu d'avoir une table testtbl dans la nouvelle base de données, il n'y a pas de tables.

Quelqu'un peut-il voir ce que je fais mal? Merci!

Répondre

2

Il semble que procéder de cette façon (en copiant les fichiers de base de données hors du conteneur) ne fonctionnera tout simplement pas, à cause de la façon dont MySQL stocke les données. Plus précisément, les fichiers InnoDB ne peuvent pas être copiés juste - this documentation indique que

méthodes de copie de fichiers de table ne fonctionnent pas si la base de données contient des tables InnoDB ... parce que InnoDB fait le contenu de la table de magasin pas nécessairement dans les répertoires de base de données. En outre, même si le serveur ne met pas à jour activement les données, InnoDB peut toujours avoir des données modifiées mises en cache et non vidées sur le disque.

Donc la réponse courte à cette question est "cela ne peut pas être fait de cette façon". La réponse longue est d'utiliser mysqldump ou un outil similaire pour ce faire.

Questions connexes