Comment maintenir les données dans une base de données postgrés documentée en utilisant des volumes

mon docker compose le 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 but est de monter un volume qui correspond à un dossier local appelé ./database à l'intérieur du conteneur postgres comme /var/lib/postgres . Quand je démarre ces conteneurs et insère des données dans postgres, je vérifie que /var/lib/postgres/data/base/ est plein des données que j'ajoute( dans le conteneur postgres), mais dans mon système local, ./database obtient seulement un Le dossier data , c'est-à-dire ./database/data est créé, mais il est vide. Pourquoi?

Notes:

UPDATE 1

selon la suggestion de Nick, j'ai fait un docker inspect et j'ai trouvé:

    "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 que les données sont volées par un autre volume que je n'ai pas codé moi-même. Pas sûr pourquoi. Est-ce que l'image postgres crée ce volume pour moi? Si oui, y a-t-il un moyen d'utiliser ce volume au lieu du volume que je monte lorsque je redémarre? Sinon, y a-t-il une bonne façon de désactiver cet autre volume et d'utiliser le mien, ./database ?

UPDATE 2

j'ai trouvé la solution, merci à Nick! (et un autre ami) répondez ci-dessous.

87
demandé sur Alex Lenail 2017-01-13 18:02:12

4 réponses

étrangement, la solution a fini par être de changer

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

à

volumes:
  - ./postgres-data:/var/lib/postgresql/data
133
répondu Alex Lenail 2017-01-14 14:10:23

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

 docker volume create pgdata

ou vous pouvez composer un fichier

   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 au 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"
    }
]
37
répondu Nishchit Dhanani 2018-01-17 19:33:42

j'éviterais d'utiliser un chemin relatif. Rappelez-vous que docker est une relation démon/client.

lorsque vous exécutez la composition, il s'agit essentiellement de décomposer en différentes commandes client docker, qui sont ensuite passées au démon. Ce ./database est alors relatif au démon , pas le client.

maintenant, l'équipe de développement docker a un peu de va-et-vient sur cette question , mais le le fait est qu'il peut avoir des résultats inattendus.

en bref, n'utilisez pas un chemin relatif, utilisez un chemin absolu.

4
répondu Nick Burke 2017-01-13 18:43:19

je pense que vous avez juste besoin de créer votre volume à l'extérieur docker d'abord avec un docker create -v /location --name et puis le réutiliser.

et au moment où j'utilisais beaucoup docker, il n'était pas possible d'utiliser un volume de docker statique avec la définition dockerfile donc ma suggestion est d'essayer la ligne de commande (éventuellement avec un script ) .

1
répondu Joel B 2017-01-13 23:40:21