Je dois enregistrer ma base de données à partir d'un conteneur mysql docker afin que les autres membres de l'équipe puissent également y travailler. Jusqu'à présent, nous utilisions ceci, qui fonctionnait très bien:
volumes:
- ./db/:/var/lib/mysql/
Cependant, le dossier /db était vraiment désordonné, car le dossier /mysql contient tous les fichiers mysql, pas seulement la base de données. J'ai donc essayé de ne sauvegarder que le dossier de la base de données :
volumes:
- ./db/:/var/lib/mysql/database/
Mais malheureusement, j'ai toujours cette erreur :
[ERROR] --initialize specified but the data directory has files in it. Aborting.
[ERROR] Aborting
Cependant, malgré ce que dit l'erreur, le dossier /db est vide (pas de fichiers cachés non plus), donc je n'ai aucune idée de la nature de l'erreur.
J'ai également essayé d'autres sous-répertoires dans /mysql et j'ai obtenu le même résultat. Lorsque je rétablis les modifications, - ./db/:/var/lib/mysql/
l'erreur disparaît.
Docker-compose.yml complet :
mysql:
image: mysql:${MYSQL_VERSION:-latest}
restart: always
ports:
- "3306:3306"
volumes:
- ./db/:/var/lib/mysql/${DB_NAME}
networks:
- backend
environment:
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
MYSQL_DATABASE: "${DB_NAME}"
MYSQL_USER: "${DB_USERNAME}"
MYSQL_PASSWORD: "${DB_PASSWORD}"
container_name: ${PROJECT_PREFIX}_mysql
Il y a quelques points à noter avec l'exemple que vous avez partagé :
up
(une pratique courante car elle maintient la taille de l'image relativement petite)volumes
. Par conséquent, chaque fois que vous faites un cycle avec down
/ up
, vous réinitialisez le conteneur à l'état d'origine de l'image.down
/ up
, l'ordre des opérations est le suivant :
3
, les scripts de point d'entrée de MySQL "initialiseront" le serveur de base de données si le /var/lib/mysql
répertoire est vide, sinon, il le chargera simplement à partir de fichiers existants./var/lib/mysql
, cela fonctionne car :
/var/lib/mysql/database
, seul ce répertoire est monté et d'autres données importantes ne sont pas incluses dans le /var/lib/mysql
car il n'existe pas dans l'image d'origine. Il s'avère que les autres données importantes manquantes sont celles que MySQL vérifie pour vérifier s'il doit "initialiser" le serveur de base de données ou non. Il tente enfin de s'initialiser en raison des données manquantes, mais si le /var/lib/mysql
n'est pas vide, il renvoie une erreur (votre erreur). Dans ce cas, il n'est pas vide car vous avez monté dans un database
répertoire dans /var/lib/mysql
.Vos options sont essentiellement :
/var/lib/mysql
et la sauvegarde de l'intégralité du répertoire (assurez-vous de ne faire des sauvegardes que lorsque vous l'avez faitdocker-compose down
!)RUN
étapes supplémentaires pour initialiser MySQL et le désactiver afin que le serveur de base de données soit « initialisé » et stocké dans l'image. Cependant, je ne le recommanderais pas car : 1) la taille de votre image Docker sera beaucoup plus grande et 2) cette option est sujette à des problèmes de corruption.Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots