web-dev-qa-db-fra.com

comment puis-je sauvegarder une base de données dans Docker

j'exécute mon application avec docker-compose avec le fichier yml ci-dessous

  postgres:
    container_name: postgres
    image: postgres:${POSTGRES_VERSION}
    volumes:
      - postgresdata:/var/lib/postgresql/data
    expose:
      - "5432"
    environment:
      - POSTGRES_DB=42EXP
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  node:
    container_name: node
    links:
      - postgres:postgres
    depends_on:
      - postgres

volumes:
  postgresdata:

Comme vous pouvez le voir ici, j'utilise un named volume pour gérer l'état de postgres.

Selon la documentation officielle, je peux sauvegarder un volume comme celui-ci

docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

Certains autres tutoriels ont suggéré d’utiliser la fonction pg-dump fournie par postgres pour les sauvegardes.

pg_dump -Fc database_name_here > database.bak

Je suppose que je devrais aller à l'intérieur du conteneur postgres pour exécuter cette fonction et monter le répertoire de sauvegarde sur l'hôte.

Une approche est-elle meilleure/préférable que l'autre?

11
Kannaj

Pour exécuter pg_dump, vous pouvez utiliser la commande docker exec:

Pour sauvegarder:

docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

Abandonner la base de données (ne le faites pas en production, uniquement à des fins de test !!!):

docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

Restaurer:

docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

Aussi, vous pouvez utiliser analogique docker-composer de exec. Dans ce cas, vous pouvez utiliser le nom de service court (postgres) au lieu du nom de conteneur complet (composeproject_postgres).

docker exec

docker-compose exec

pg_restore

35
tck

Je viens de valider le conteneur qui exécute la base de données. Ensuite, je pousse cette nouvelle image dans mon registre privé. Quoi qu’il advienne de l’application ou de la base de données, je peux toujours l’extraire de mon registre et l’avoir immédiatement.

docker commit [container-name] [domain:port/'new-image-name']

Puis, après cela, j’affiche l’image dans mon registre.

docker Push [new-image-name]

Si j'ai besoin de restaurer cette base de données, je la retire simplement de mon propre registre comme celui-ci.

docker pull [domain:port/'new-image-name']

Donc, juste pour clarifier, ceci: [domaine: port/'nouveau-image-nom']

Cela ressemblerait à ceci: myregistrydomain.com:5000/dbSep

0