Comment enregistrer le sous-répertoire mysql sur le système local à partir d'un conteneur docker

Chat noir

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
Raphaël Guzman

Il y a quelques points à noter avec l'exemple que vous avez partagé :

  • L'image MySQL que vous utilisez n'initialise pas réellement le serveur de base de données tant qu'elle n'est pas importée pour la première fois up(une pratique courante car elle maintient la taille de l'image relativement petite)
  • Les conteneurs Docker ne conservent aucune donnée à moins que vous ne les montiez explicitement à l'aide de 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.
  • Lorsque vous parcourez down/ up, l'ordre des opérations est le suivant :
    1. l'état d'origine de l'image est utilisé
    2. les supports de volume sont montés dans la prochaine
    3. les scripts de point d'entrée sont exécutés pour afficher le conteneur.
  • Pour le cas du point 3, les scripts de point d'entrée de MySQL "initialiseront" le serveur de base de données si le /var/lib/mysqlrépertoire est vide, sinon, il le chargera simplement à partir de fichiers existants.
  • Lorsque vous montez /var/lib/mysql, cela fonctionne car :
    • si le répertoire est vide, alors il est initialisé
    • si le répertoire n'est pas vide, alors il charge l'état.
  • Cependant, lorsque vous montez dans /var/lib/mysql/database, seul ce répertoire est monté et d'autres données importantes ne sont pas incluses dans le /var/lib/mysqlcar 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/mysqln'est pas vide, il renvoie une erreur (votre erreur). Dans ce cas, il n'est pas vide car vous avez monté dans un databaserépertoire dans /var/lib/mysql.

Vos options sont essentiellement :

  • Live avec le montage /var/lib/mysqlet la sauvegarde de l'intégralité du répertoire (assurez-vous de ne faire des sauvegardes que lorsque vous l'avez faitdocker-compose down !)
  • Créez votre propre Dockerfile avec des 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.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Comment utiliser HttpClient avec TOUT cert ssl, quelle que soit la « mauvaise » est

  2. 2

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  3. 3

    Résultat de l'échantillonneur JMeter : comprendre le temps de chargement, le temps de connexion et la latence

  4. 4

    Modbus Python Schneider PM5300

  5. 5

    Pourquoi Object.hashCode () ne suit pas la convention du code Java

  6. 6

    Comment faire une recherche partielle et obtenir un score pertinent dans Elasticsearch

  7. 7

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  8. 8

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  9. 9

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  10. 10

    Comment changer la couleur de la police dans R?

  11. 11

    Autocomplete avec java, Redis, Recherche élastique, Mongo

  12. 12

    MasterService d'ElasticSearch prend trop de temps pour calculer l'état du cluster et lancer ProcessClusterEventTimeoutException

  13. 13

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  14. 14

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  15. 15

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  16. 16

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  17. 17

    Quelque chose dans le cluster Elasticsearch 7.4 devient de plus en plus lent avec les délais de lecture de temps en temps

  18. 18

    Ajustement non linéaire avec R

  19. 19

    php ajouter et fusionner des données de deux tables

  20. 20

    Exporter la table de l'arborescence vers CSV avec mise en forme

  21. 21

    帶有 Spring Boot 和 Azure AD 的 KeyCloak

chaudétiquette

Archive