Je suis un peu confus avec la fonctionnalité des volumes nommés dans un fichier de composition de docker, en particulier lorsqu'il s'agit de sauvegarder/restaurer mon application.
Je teste actuellement ce fichier de composition de dock:
version: '2'
services:
Django:
build:
context: "{{ build_dir }}/docker/Django"
depends_on:
- db
environment:
[...]
volumes:
- code:/data/code
- www:/var/www
- conf:/data/conf
networks:
- front
- db
expose:
- "8080"
entrypoint: "/init"
db:
build:
context: "{{ build_dir }}/docker/postgres"
environment:
[...]
volumes:
- data:/var/lib/postgresql/data
networks:
- db
volumes:
data:
www:
code:
conf:
networks:
front:
external:
name: "proxy_nw"
Comme le dit la documentation, j'ai essayé d'utiliser le volume nommé au lieu du conteneur de données uniquement. Mais comment suis-je supposé sauvegarder mes données?
Avec un conteneur de données uniquement, j'aurais fait un docker run --rm --volume-from DOC backup_container save
qui est vraiment facile.
Maintenant, je lis dans ce sujet que je devrais utiliser quelque chose comme docker run --rm --volume data --volume www --volume code --volume conf backup_container save
. Ce n’est pas si simple, car je possède de nombreuses applications avec différents types et noms de volumes, ce qui signifie que ma commande de sauvegarde des données doit être différente pour chaque application. Cela complique le processus d'automatisation.
Edit: En fait, cette syntaxe docker run --volume data --volume www container_image my_command
est incorrecte. Il a besoin du point de montage à l'intérieur du conteneur, il s'agirait donc de docker run --volume data:/somewhere --volume www:/somewhereelse container_image my_command
. C'est donc encore plus compliqué à utiliser avec un conteneur de sauvegarde.
Alors, quelles sont les meilleures pratiques dans ce cas? Devrais-je utiliser un seul volume nommé pour tous mes conteneurs?
En fait, cela devrait être fait de la même manière que dans la documentation officielle. Le conteneur de volumes de données stocke ses données dans la "racine virtuelle". Vous devez donc sauvegarder avec la commande suivante:
docker run --rm \
--volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \
--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
ubuntu \
tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA]
où:
Récupérer les données dans le volume (restaurer):
docker run --rm \
--volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \
--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
ubuntu \
tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1
où:
J'ai finalement changé mon approche. J'analyse les volumes de mes conteneurs à la recherche des points de montage et je sauvegarde tout dans un dossier séparé dans le fichier tar.
Donc, je n'utilise pas de conteneur pour le faire, mais un script externe. Je ne sais pas si c'est une meilleure approche mais cela fonctionne bien.