Postgres Docker Контейнерные таблицы отсутствуют в локальной БД windows - PullRequest
0 голосов
/ 25 апреля 2020

С windows я подключился к Postgres Docker контейнеру с локальной машины. Но я не вижу таблицы, которые существуют в postgres контейнере. Данные не реплицируются локально. Я следовал этому учебнику для запуска контейнера postgres на windows.

Мне удалось создать таблицы из файла дампа.

$ docker volume create --name postgres-volume

$ docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v postgres-volume:/var/lib/postgresql/data -d postgres

$ docker exec -it <container-id> bash -c "pg_dump -h <source-url> -U postgres  -d postgres > /tmp/dump.sql"

$ docker exec -it <container-id> bash -c "psql -f /tmp/dump.sql -U postgres -d postgres"

Любая помощь, приветствуется.

1 Ответ

2 голосов
/ 25 апреля 2020

Контейнеры

Контейнеры предназначены для изолированного экземпляра программы / службы. Они изолированы как от хозяина, так и от последующих появлений одного и того же изображения. Они начинаются на изолированном острове, на котором ничего нет (что он не принес сам). Любые данные, которые они генерируют, теряются при их смерти. Кроме того, они совершенно не обращают внимания на любые данные на хосте (на данный момент). Но иногда мы хотим, чтобы их данные были постоянными или «вводили» наши собственные данные при каждом запуске. Например, ваш случай с PostgreSQL. Мы хотим, чтобы PostgreSQL имела нашу схему доступной при каждом запуске. И было бы замечательно, если бы в нем были сохранены какие-либо сделанные нами изменения или загруженные данные.

Docker Тома

Введите docker тома . Это хороший способ управления постоянным хранилищем для контейнеров. Они предназначены для установки в контейнеры и позволяют им записывать свои данные (или читать из предыдущих экземпляров), которые не будут удалены, если будет удален экземпляр контейнера. Как только вы создадите том с помощью docker volume create myvolume1, он создаст каталог в /var/lib/docker/volumes/ (на windows это будет другой вариант по умолчанию. Может быть изменен). Вам никогда не нужно знать о физическом каталоге на вашем хосте. Вам нужно знать только имя тома myvolume1 (или любое другое имя, которое вы выберете).

Контейнеры с постоянными данными (docker тома)

Как мы уже говорили, контейнеры по умолчанию полностью изолированы от хоста. В частности, его файловая система тоже. Это означает, что при запуске контейнера он не знает, что находится в файловой системе хоста. И когда экземпляр контейнера удаляется, данные, которые он генерировал в течение своей жизни, исчезают вместе с ним.
Но, если мы используем docker volumes, все будет иначе. После запуска контейнера мы можем монтировать внутри него данные извне. Эти данные могут быть либо docker volume, о котором мы говорили ранее, либо указанным c путем, который мы хотим (например, / home / me / что-то, что мы сами управляем). Последний не docker volume, но работает точно так же.

Учебное пособие

Учебное пособие, которое вы связали, говорит о монтировании как пути, так и docker volume ( в отдельных примерах). Это делается с флагом -v при выполнении docker run. Поскольку при использовании docker на windows существует проблема с разрешениями для каталога данных PostgreSQL на хосте (который монтируется в контейнере), они рекомендуют использовать docker volumes.
Это означает, что вы необходимо создать схему и загрузить все необходимые данные после того, как вы использовали docker volume с вашим экземпляром PostgreSQL. Последующие перезапуски контейнера должны использовать те же docker volume.

docker volume create --name postgres-volume

docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v postgres-volume:/var/lib/postgresql/data -d postgres

Из учебника

Это две важные строки. Первый создает создает docker volume, а второй запускает экземпляр fre sh PostgreSQL. Любые изменения, внесенные вами в данные этого экземпляра (DML DDL), будут сохранены в docker volume postgres -объеме . Если вы ранее развернули контейнер (например, PostgreSQL), который использует этот том, он найдет данные так же, как они были оставлены в прошлый раз. Другими словами, что делает вторую строку экземпляром fre sh, так это то, что docker volume пуст (он был только что создан). Последующие экземпляры PostgreSQL найдут схему + данные, которые вы загрузили ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...