web-dev-qa-db-fra.com

Comment dois-je sauvegarder et restaurer les volumes nommés du menu fixe

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?

18
Plup

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ù:

  • --rm signifie que l'image créée pour cette commande d'exécution sera nettoyée
  • DOCKER_COMPOSE_PREFIX Par défaut, le nom du répertoire de votre projet
  • VOLUME_NAME est le nom du conteneur de volumes de données provenant du fichier de composition
  • TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA est un répertoire pour monter vos données de volume
  • TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE est un répertoire virtuellement mappé sur votre répertoire actuel, où la sauvegarde sera placée.
  • BACKUP_FILENAME - un nom de fichier de sauvegarde (vous le trouverez dans le répertoire en cours)
  • ubuntu - vous pouvez changer le type d'image dans un autre conteneur avec tar :)

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ù:

  • TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP est un répertoire dans lequel les fichiers extraits seront copiés (celui-ci est lié au volume et y est donc écrit)
  • -C - indique à tar où extraire le contenu
  • --strip 1 - supprime les éléments du chemin principal (par exemple, le répertoire parent si le contenu de la sauvegarde se trouve dans un dossier/temp ou similaire)
35
Aleksey Rembish

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. 

0
Plup