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.

10
demandé sur Community 2016-06-15 14:41:16

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.

12
répondu Simon 2016-07-01 15:35:07

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).

0
répondu alexkb 2018-09-11 07:47:20

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.

-1
répondu shiva 2017-05-06 21:45:48