Docker-составить дамп импорта Postgresql

у меня вопрос о докере и Постгресе. Я настраиваю новую базу данных postgres каждый раз, когда docker запускается и хочет импортировать данный дамп.

моя проблема похожа, но ответов для меня недостаточно:Docker postgres не запускает init-файл в docker-entrypoint-initdb.d

Docker-Compose:

postgres:
  environment:
   - POSTGRES_USER=****
   - POSTGRES_PASSWORD=****
   - POSTGRES_DB=****
build:
  context: .
  dockerfile: dockerfile-postgres

My Dockerfile: (я пробовал это уже со скриптом.Ш.)

FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/

По данным https://hub.docker.com/_/postgres/ сброс.для импорта базы данных необходимо использовать sql.

запуск приложения с помощью docker дает только:

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

кроме того, я проверил, была ли импортирована моя база данных, в моей базе данных нет таблицы. Что я делаю неправильно (файлы читаются и исполняются в целевой системе)? Импорт его с psql не проблема, поэтому мой дамп правильный.

Я надеюсь, что вы можете помочь мне, и я хочу поблагодарить вас заранее он.

3 ответов


хорошо, я нашел трюк, я должен выполнить "docker-compose rm", чтобы выполнить скрипты и файлы sql в этой папке. После создания и не удаления папка init игнорируется.

обновление Я снова столкнулся с этой проблемой, на этот раз удаление изображений, созданных докером, решило проблему.


ответы здесь несколько решили проблему для меня, но последний шаг, чтобы получить docker-entrypoint-initdb/*.sql скрипты работали, чтобы убедиться, что в самих сценариях sql не было синтаксических проблем (у меня были проблемы, потому что я изменил версии SQL в своем Dockerfile).

если таковые существуют, все в docker-entrypoint-initdb/*.sql скрипты, похоже, откатываются.

чтобы проверить, есть ли какие-либо проблемы с синтаксическим скриптом (или другие проблемы) , вам может быть полезно посмотреть на докер журналы:

$ docker ps -all

Примечание:-all гарантирует, что он перечисляет те изображения, которые, возможно, не удалось запустить тоже.

найдите только что созданное изображение и найдите идентификатор контейнера, который должен быть хэшем из 12 символов:

$ docker logs baf32ff7ec03

помните, что вам все равно нужно следовать другим ответам здесь - которые должны rm ранее построенные изображения и удалить папку данных (резервное копирование, если вам нужно).


это происходит потому, что, скорее всего,

скрипты initdb docker-entryfile.sh который затем отвечает за запуск /docker-entrypoint-initdb.d/* файлы в алфавитном порядке запускаются впервые только при создании томов.

вы можете увидеть некоторые детали здесь .

решение ( работает со мной ) Это фрагмент из моего файла docker-compose

  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

действия -

1) docker-compose -f docker-compose-filename.yml down

или

docker-compose -f docker-compose-filename.yml stop postgres_service

2) Удалите том / Тома (/Users / yogesh.yadav/DockerData/datahub/postgresql / data), прикрепленный с помощью службы докеров postgres_service. Вы можете сделать это вручную или через docker-compose rm или docker volume rm. Пожалуйста, определите ваш том, который прикреплен к этой службе postgres, прежде чем удалить его. подробнее здесь

3) Docker использует очень хорошее управление кэшем через создание изображений и их запуск. Если вы сделали не изменяйте свой Dockerfile , docker собирается запустить уже созданный образ из кэша и запустить его. Поэтому я бы посоветовал удалить изображения и для postgres_service.

список изображений

docker images -a

выход -

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
datahub/postgres          development         e7707e670ad4        35 minutes ago      265 MB

удалите это изображение (при необходимости используйте-f )

docker rmi IMAGE_ID_HERE

4) перезапустите службу еще раз

docker-compose -f docker-compose-filename.yml up --build postgres_service

на этот раз вы можете видеть, что ваш docker-entrypoint.sh и dump.sql будет выполнять.