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.
DDL
dans un chemin arbitraire et en montant le script d'entrée dans docker-entrypoint-initdb.d
avec bind
, docker-entrypoint-initdb.d
Les données initiales peuvent être entrées sans monter DDL
surJe 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.
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
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.
Recommended Posts