Docker-composer PostgreSQL Import dump
j'ai une question à propos de docker et postgres. Je mets en place une nouvelle base de données postgres chaque fois que docker démarre et veut importer un dump donné.
Mon Problème est, mais les réponses ne sont pas suffisantes pour moi: Docker postgres ne lance pas de fichier init dans docker-entrypoint-initdb.d
Menu Fixe-Composer:
postgres:
environment:
- POSTGRES_USER=****
- POSTGRES_PASSWORD=****
- POSTGRES_DB=****
build:
context: .
dockerfile: dockerfile-postgres
Mon Dockerfile: (je l'ai déjà essayé avec un script avec .sh fin)
FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/
Selon https://hub.docker.com/_/postgres/ dump.sql doit être utilisé pour importer la base de données.
Démarrer l'application avec docker ne donne que:
postgres_1 | LOG: invalid record length at 0/1708600
postgres_1 | LOG: redo is not required
postgres_1 | LOG: MultiXact member wraparound protections are now enabled
postgres_1 | LOG: database system is ready to accept connections
postgres_1 | LOG: autovacuum launcher started
en plus j'ai testé si ma base de données a été importée, il n'y a pas de table dans ma base de données. Qu'est - ce que je fais de mal (les fichiers sont lus-et exécutables sur le système cible)? L'importer avec psql n'est pas un problème, donc mon dump est correct.
j'espère que vous pourrez m'aider et je tiens à vous remercier à l'avance pour il.
3 réponses
OK j'ai trouvé le truc, je dois exécuter "docker-composer rm" pour exécuter les scripts et les fichiers sql dans ce dossier. Une fois construit et pas retiré le dossier init est ignoré.
UPDATE J'ai rencontré ce problème à nouveau, cette fois en enlevant les images docker créé résolu le problème.
les réponses ici ont quelque peu résolu le problème pour moi, mais l'étape finale pour obtenir le docker-entrypoint-initdb/*.sql
scripts le travail était de s'assurer qu'il n'y avait pas de problèmes de syntaxe dans les scripts sql eux-mêmes (j'ai eu des problèmes parce que J'ai changé les versions SQL dans mon fichier Dockerfile).
le Cas échéant, tout est dans le docker-entrypoint-initdb/*.sql
les scripts semblent revenir en arrière.
pour vérifier s'il y a des problèmes de script de syntaxe (ou d'autres problèmes) vous pouvez trouver utile de regarder le docker logs:
$ docker ps -all
Remarque:-all
s'assure qu'il liste les images qui peuvent avoir échoué à démarrer aussi.
trouvez l'image que vous venez de créer et recherchez le conteneur id qui devrait être un hachage de 12 caractères:
$ docker logs baf32ff7ec03
rappelez-vous que vous devez encore suivre les autres réponses ici - qui sont de gérer les images précédemment construites et de supprimer votre dossier de données (Sauvegarder si vous avez besoin).
Il se passe parce que probablement,
les scripts initdb docker-entryfile.sh
qui est alors responsable de l'exécution de /docker-entrypoint-initdb.d/*
les fichiers par ordre alphabétique ne s'exécutent pour la première fois que lorsque les volumes sont créés.
Vous pouvez voir quelques détails ici .
Solution (fonctionne avec moi ) C'est un extrait de mon fichier docker-composer
postgres_service:
build:
context : docker-postgres
dockerfile: Dockerfile-base
image: 'datahub/postgres:development'
user: postgres
ports:
- "5432:5432"
env_file:
- credentials/postgres/development.env
volumes:
- /Users/yogesh.yadav/DockerData/datahub/postgresql/data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- datahubnetwork
les Étapes -
1)docker-compose -f docker-compose-filename.yml down
ou
docker-compose -f docker-compose-filename.yml stop postgres_service
2) Supprimer le volume/volume ( /Users/yogesh.yadav/DockerData/datahub/postgresql / data ) joint avec le service postgres_service docker. Vous pouvez le faire manuellement ou à l'aide de docker-compose rm
ou docker volume rm
. Veuillez identifier votre volume qui est attaché à ce service postgres avant de le retirer. Plus d'info ici
3) Docker utilise une très bonne gestion de cache via la construction d'images et leur exécution. Si vous n'avez ne pas modifier votre Dockerfile
, docker va exécuter l'image déjà compilée à partir du cache et l'exécuter. Je vous conseille donc de supprimer les images de postgres_service.
Pour la Liste des images
docker images -a
Sortie
REPOSITORY TAG IMAGE ID CREATED SIZE
datahub/postgres development e7707e670ad4 35 minutes ago 265 MB
Supprimer l'image ( à Utiliser -f si nécessaire )
docker rmi IMAGE_ID_HERE
4) Redémarrez votre service à nouveau
docker-compose -f docker-compose-filename.yml up --build postgres_service
Cette fois, vous pouvez voir que votre docker-entrypoint.sh
et dump.sql
exécuter.