Comment faire pour conserver les données dans un dockerized base de données postgres à 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
dossier en elle, c'est à dire ./database/data
est créé, mais il est vide. Pourquoi?
Notes:
- Ceci suggère mon fichier ci-dessus devrait fonctionner.
- Cette personne est à l'aide de docker services qui est intéressant
Mise à JOUR de 1
Par Nick suggestion, j'ai fait un docker inspect
et 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": ""
}
],
Qui permet de croire que les données volées 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 que 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.
- avez-vous déjà exécuté la
initdb
ligne de commande pour initialiser votre cluster de base de données? - Êtes-vous sûr que vos données sous-répertoire est vraiment vide? Il peut avoir des autorisations d'accès spéciales.
- Merci de revenir vers moi si vite! Je suis à l'aide d'un flacon d'application, donc je
from app import db
etdb.create_all()
à partir d'undocker run
après le démarrage de l'conteneurs. Je n'ai pasinitdb
directement à partir de la ligne de commande. - Je ne sais pas comment vérifier que
sudo su -
et de regarder dans./database/data
. Il n'y a rien là-dedans aussi loin que je peux dire. - Quelqu'un pourrait trouver cela utile: exemple de fichier composer la persistance de postgres, elastic search et supports de données, stackoverflow.com/a/56475980/5180118
Vous devez vous connecter pour publier un commentaire.
Étrangement, la solution a fini par être à changer
à
/var/lib/postgresql/data
- vous pouvez lire le PGDATA variable notes ici: store.docker.com/images/....dockerignore
fichier, surtout si vous aurez jamais trun cela dans une production de l'image. Voir codefresh.io/blog/pas-ignorer-dockerignore pour une discussion.docker rm my_postgres_container_1
avant cela a fonctionné (également en Haut de la Sierra).Vous pouvez créer un volume pour tous Postgres données
ou vous pouvez composer un fichier
Il va créer un nom de volume pgdata et de monter ce volume du conteneur chemin.
Vous pouvez inspecter ce volume
docker-compose down -v
. Et quelle est la solution à cela?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. Que
./database
est donc par rapport à la démon, pas le client.Maintenant, le docker dev team 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.
database/data
dossier est toujours vide =(docker inspect
sur le conteneur et assurez-vous que le récipient est conscient du volume (juste au cas où compose est confus ou quelque chose). (remarque: le panneau inspecter pouvez avez des données sensibles, afin de ne pas le coller ici sans munging 😉 Après c'est une question de vérification des autorisations (bien que normalement afficher une erreur)Je pense que vous avez juste besoin de créer votre volume à l'extérieur de panneau d'abord avec un
docker create -v /location --name
et la réutiliser.Et par moment j'ai l'habitude d'utiliser docker beaucoup, il n'était pas possible d'utiliser un statique docker volume avec dockerfile définition donc, ma suggestion est d'essayer de la ligne de commande (avec éventuellement un script ) .