353 votes

Comment conserver des données dans une base de données postgres dockerisée à l'aide de volumes

Mon menu fixe composer fichier a trois conteneurs, web, nginx, et postgres. Postgres ressemble à ceci:

postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - "5432:5432

Mon objectif est de monter un volume qui correspond à un dossier local appelé ./database à l'intérieur de la postgres conteneur /var/lib/postgres. Quand j'ai commencer ces conteneurs et insérer des données dans postgresql, j'ai vérifier que /var/lib/postgres/data/base/ est plein de données, je suis en ajoutant (dans la postgres conteneur), mais dans mon système local, ./database obtient seulement une data le dossier, c'est à dire ./database/data est créé, mais il est vide. Pourquoi?

Notes:

Mise à JOUR 1

Par Nick suggestion, j'ai fait un docker inspect trouvés:

    "Mounts": [
        {
            "Source": "/Users/alex/Documents/MyApp/database",
            "Destination": "/var/lib/postgresql",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
            "Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

Ce qui donne l'impression de données est volé par un autre volume, je n'ai pas de code moi-même. Pas sûr pourquoi. Est la postgres image de la création de ce volume pour moi? Si oui, est-il un moyen d'utiliser le volume plutôt que le volume, je suis de montage lorsque je redémarre? Sinon, est-il un bon moyen de la désactivation de cet autre volume et en utilisant ma propre, ./database?

Mise à JOUR 2

J'ai trouvé la solution, merci à Nick! (et autre ami) Réponse ci-dessous.

444voto

Alex Lenail Points 2543

Curieusement, la solution a fini par être de changer

 volumes:
  - ./postgres-data:/var/lib/postgresql
 

à

 volumes:
  - ./postgres-data:/var/lib/postgresql/data
 

174voto

Nishchit Dhanani Points 619

Vous pouvez créer un volume commun pour toutes les données Postgres

  docker volume create pgdata
 

ou vous pouvez le définir sur le fichier de composition

    version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:
 

Il créera le nom de volume pgdata et montera ce volume sur le chemin du conteneur.

Vous pouvez inspecter ce volume

 docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]
 

16voto

Nick Burke Points 579

Je voudrais éviter d'utiliser un chemin relatif. Rappelez-vous que le panneau est un démon/relation client.

Lorsque vous exécutez le composent, c'est essentiellement juste de se décomposant en différentes panneau des commandes du client, qui sont ensuite transmis au démon. Qu' ./database est alors relatif au démon, pas le client.

Maintenant, le panneau de l'équipe de développement a plusieurs allers et retours sur cette question, mais la ligne de fond est qu'on peut avoir des résultats inattendus.

En bref, ne pas utiliser un chemin relatif, utilisez un chemin d'accès absolu.

3voto

Joel B Points 309

Je pense que vous avez juste besoin de créer votre volume en dehors du menu fixe en premier avec un docker create -v /location --name puis de le réutiliser.

Et au moment où j’utilisais souvent docker, il n’était pas possible d’utiliser un volume fixe avec une définition de dockerfile; ma suggestion est donc d’essayer la ligne de commande (éventuellement avec un script).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X