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:
- ceci suggère que mon fichier ci-dessus devrait fonctionner.
- cette personne utilise des services docker qui est intéressant
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.
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
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"
}
]
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.
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 ) .