Mon fichier de composition Docker a trois conteneurs, Web, Nginx et PostgreSQL. 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 du conteneur postgres comme /var/lib/postgres
. Lorsque je démarre ces conteneurs et que j'insère des données dans PostgreSQL, je vérifie qu'elles /var/lib/postgres/data/base/
sont pleines des données que j'ajoute (dans le conteneur PostgreSQL), mais dans mon système local, ./database
ne contient qu'un data
dossier, c'est ./database/data
-à- dire qu'il est créé, mais il est vide . Pourquoi?
Remarques:
- Cela suggère que mon fichier ci-dessus devrait fonctionner.
- Cette personne utilise des services de docker, ce qui est intéressant
MISE À JOUR 1
Selon la suggestion de Nick, 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": ""
}
],
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. Je ne sais pas pourquoi. L'image postgres crée-t-elle ce volume pour moi? Si oui, existe-t-il un moyen d'utiliser ce volume au lieu du volume que je monte lorsque je redémarre? Sinon, est - il une bonne façon de désactiver cet autre volume et en utilisant mon propre, ./database
?
MISE À JOUR 2
J'ai trouvé la solution, grâce à Nick! (et un autre ami) Répondez ci-dessous.
la source
initdb
ligne de commande pour initialiser votre cluster de base de données?from app import db
etdb.create_all()
d'undocker run
après le démarrage des conteneurs. Je ne suis pasinitdb
directement à partir de la ligne de commande.sudo su -
et regarder./database/data
. Pour autant que je sache, il n'y a rien là-dedans.Réponses:
Curieusement, la solution a finalement été de changer
à
la source
/var/lib/postgresql/data
- vous pouvez lire les notes variables PGDATA ici: store.docker.com/images/….dockerignore
fichier, surtout si vous voulez le regrouper dans une image de production. Voir codefresh.io/blog/not-ignore-dockerignore pour une discussion.docker rm my_postgres_container_1
avant que ça marche (aussi High Sierra).Vous pouvez créer un volume commun pour toutes les données Postgres
ou vous pouvez le définir dans le fichier de composition
Il créera le nom de volume pgdata et montera ce volume sur le chemin du conteneur.
Vous pouvez inspecter ce volume
la source
docker-compose down -v
. Et quelle est la solution à cela?docker-compose down --rmi all
sans l'-v
option et cela effacera "tout" sauf les volumes, c'est-à-dire les conteneurs, les réseaux, les images, etc. Je le fais lors du déploiement tout en permettant la persistance des données.J'éviterais d'utiliser un chemin relatif. N'oubliez pas que docker est une relation démon / client.
Lorsque vous exécutez la composition, elle se décompose essentiellement en diverses commandes client Docker, qui sont ensuite transmises au démon. C'est
./database
alors relatif au démon , pas au client.Maintenant, l'équipe de développement de docker a des allers-retours sur ce problème , mais l'essentiel est que cela peut avoir des résultats inattendus.
En bref, n'utilisez pas de chemin relatif, utilisez un chemin absolu.
la source
database/data
dossier est toujours vide = (docker inspect
le conteneur et assurez-vous que le conteneur est conscient du volume (juste au cas où la composition est confuse ou quelque chose). (Remarque: Docker inspect peut avoir des données sensibles, alors ne les collez pas ici sans les munging ;-) Après cela, il s'agit de vérifier les autorisations (bien que cela afficherait généralement une erreur)Je pense que vous avez juste besoin de créer votre volume hors docker d'abord avec un
docker create -v /location --name
, puis de le réutiliser.Et au moment où j'utilisais beaucoup Docker, il n'était pas possible d'utiliser un volume Docker statique avec une définition Dockerfile, donc ma suggestion est d'essayer la ligne de commande (éventuellement avec un script).
la source