Je publie ce code car je le trouve bien pratique. Le raisonnement me semble logique et j’ai apprécié le rédiger alors cela peut surement vous inspirer. Si vous êtes curieux, vous pouvez retrouver mes commandes docker sur cette page.
Alors je vous dresse les points essentiels du code car le mien fait intègre aussi postgres et mariadb (identique à mysql exactement).
Premièrement on liste les ID, les noms et les images des conteneurs. Comme on log tout cela cela permet de recréer aussi très rapidement un conteneur Docker identique. Et puis cela permet aussi de tester le dump facilement.
docker ps --format "{{ .ID }}|\ {{ .Names }}|\ {{.Image}}" |\ while IFS="|" read var1 var2 var3;\ do
Ensuite on nettoie le nom du conteneur car Docker ajoute un sha pour le rendre unique et c’est pas très causant. et on peut se créer un répertoire local de backup (mais cela peut aussi être un point de montage.
var2=$(echo $var2 | sed -e 's/\(.*\)\..*$//g') BACKUP_DIR="/dir_export/" DUMP_DIR=${BACKUP_DIR}${var2}/ DUMP=BACKUP_DIR="/export/sgbd-dumps/" DATEDUMP=$(date +%Y-%m-%d) DUMP=${DATEDUMP}.${var2}
et on commence par logger quelques infos :
echo "---- ${DATEDUMP} / Dump du container ${var2} -----" > ${DUMP_DIR}${DUMP}.log echo ${DATEDUMP}"-name >>"$var2 >> ${DUMP_DIR}${DUMP}.log echo ${DATEDUMP}"-image >>"$var3 >> ${DUMP_DIR}${DUMP}.log echo ${DATEDUMP}"-dump >>"${DUMP_DIR} >> ${DUMP_DIR}${DUMP}.log
Et c’est parti on lance la sauvegarde mysqldump en lancant un docker exec sur l’ID du conteneur recueilli.
echo "" echo "---- ${DATEDUMP} / Dump du container ${var2} -----" docker exec ${var1} mysqldump -u --password= --all-databases > ${DUMP_DIR}${DUMP}.sql
Alors on aurait pu ajouter un gzip directement dessus et ne sauvegarder qu’une seule base. Personnellement on ne sait on part sur un truc complet. Et pui savant de gzippé on vérifie le boulot 😉
Alors comment on fait pour tester notre dump ???
C’est simple. On créé un conteneur identique et ensuite on importe notre dump dedans. N’ayez pas peur c’est hyper facile.
docker run --name testsgbd -e MYSQL_ROOT_PASSWORD= -tid $var3 | grep -vi warning
sleep 40
On voit que $var3 nous permet de lancer la même image que dans le conteneur sauvegardé. Et on met tout cela en pause durant 40 secondes. C’est beaucoup mais on s’assure que le conteneur est bien lancé (ou au moins à eu le temps).
Et la on importe mais pas n’importe comment. On fait un test (un if) sur la commande d’import mysql lancée à travers docker. Si aucun message d’erreur on à ainsi un dump conforme sinon KO. Et si OK on gzip
if [ -n "$(docker exec -i testsgbd mysql -uroot -ppassRoot <${DUMP_DIR}${DUMP}.sql 2>&1 | grep -vi Warning )" ];then echo " >>> ${DATEDUMP} : [Error]" >> ${DUMP_DIR}${DUMP}.log echo "[Pb import]" rm -f ${DUMP_DIR}${DUMP} else echo " >>> ${DATEDUMP} : [OK]" >> ${DUMP_DIR}${DUMP}.log echo "[Import OK]" echo "Gzip..." gzip ${DUMP_DIR}${DUMP}*.sql echo "fin" fi
et surtout on oublie pas de nettoyer en supprimant l’image créée.
docker rm -f testsgbd
Alors c’est pas simple tout cela ?
Je trouve que si et que ça mérite d’être partagé, c’est pour cela que cela valait bien un article.