[Docker] Entrez les données initiales dans docker-entrypoint-initdb.d sans monter le répertoire [MySQL]

TL;DR --Dans Docker, monter un répertoire écrase les informations dans le conteneur, mais monter un fichier avec bind ne l'écrase pas. --Dans l'image officielle MySQL, le fichier .sh placé dans docker-entrypoint-initdb.d est exécuté au démarrage du conteneur.

Texte

Ce que je voulais faire

Je voulais exécuter l'initialisation DDL au démarrage du conteneur, sans écraser le docker-entrypoint-initdb.d dans le conteneur, et avec la même facilité d'utilisation que le montage d'un répertoire.

manière

Comme mentionné au début, le docker-entrypoint-initdb.d dans le conteneur ne sera pas écrasé si le fichier est monté. De plus, dans l'image officielle MySQL, le fichier .sh placé dans docker-entrypoint-initdb.d est exécuté au démarrage du conteneur.

Par conséquent, vous pouvez monter le répertoire contenant DDL comme un répertoire arbitraire et le saisir avec le script shell monté sur docker-entrypoint-initdb.d. Voici un exemple de script de soumission.

Script d'entrée


#!/bin/sh
#---
#Du conteneur MySql/docker-entrypoint-initdb.En le montant sous forme de fichier sur d
#De ce conteneur/tmp/init.Soumettez le DDL différentiel monté sur d dans MySQL
#
# /tmp/init.Une erreur se produira si le fichier n'existe pas dans d
#---
ls -1 /tmp/init.d/*.sql | while read file
do
  mysql -uroot -proot < $file
done

Puisque la série d'exécutions est classée par ordre alphabétique par nom de fichier, vous pouvez contrôler l'ordre en ajustant le nom de fichier au moment du montage. Par exemple, vous pouvez le faire fonctionner en dernier en préfixant le nom du fichier à monter avec zzz-.

docker-compose.yml


#Abréviation (* C'est une image, je ne l'ai pas essayée en la déplaçant)
  volumes:
    - type: bind #Montez le shell d'entrée, zzz pour faire durer l'ordre d'exécution-Le préfixe est spécifié
      source: ./init.sh
      target: /docker-entrypoint-initdb.d/zzz-init.sh
    - ./init.d:/tmp/init.d/ #Aligner DDL avec le script d'entrée/tmp/init.Monter sur d

Contexte lorsque cela était nécessaire

En effet, il était nécessaire d'utiliser une image au format qui contient les données initiales dans docker-entrypoint-initdb.d, et le répertoire n'a pas pu être monté ici. Si vous le faites en organisant les fichiers dans docker-entrypoint-initdb.d avec obéissance, vous devez monter les fichiers DDL individuellement, alors réfléchissez à comment les monter collectivement dans un répertoire et trouvez cette méthode J'ai fait.

Contenu auquel j'ai été autorisé à me référer

Recommended Posts

[Docker] Entrez les données initiales dans docker-entrypoint-initdb.d sans monter le répertoire [MySQL]
Rails6: saisissez les données initiales d'ActionText à l'aide de seed
Changer le message initial de validation en japonais sans caractères déformés
Entrée dans la console Java
[Docker] Comment sauvegarder et restaurer les données de base de données de l'application Rails sur docker-compose [MySQL]
J'ai pu déployer l'application Docker + laravel + MySQL sur Heroku!
[Rails] Entrée de données initiale avec seed_fu!
Mettre à jour MySQL de 5.7 à 8.0 avec Docker
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...