Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Хочу в Windows создать докер с PostgreSQL+ моя база. Типа демо для юзера.
Сохранять данные в базе между запусками докера хотелось бы, но на первом шаге не обязательно.
Как ?
Есть готовые докеры с постгрес, но как туда добавить свою базу?
8 июн 20, 10:45    [22147333]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Sergej Grischenkow
Member

Откуда:
Сообщений: 75
Ролг Хупин,

https://hub.docker.com/_/postgres/
8 июн 20, 11:06    [22147349]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Sergej Grischenkow
Ролг Хупин,

https://hub.docker.com/_/postgres/


Это хорошо, как сделать свой контейнер из этого + своя демо база?
8 июн 20, 11:12    [22147352]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Вам надо:
1. создать docker volume, там будут храниться данные
docker volume create <pg_volume>


2. запустить контейнер с подключенным volume из п. 1 в папку PGDATA
docker run -d --rm  -p 5432:5432 -v pg_volume:/var/lib/postgresql/data   postgres


3. подключиться к контейнеру и ч\з утилиту psql создать бд и все, что Вам надо
id_контейнера - первые несколько цифр(3-4) выведенные в п.2

docker exec -it <id_контейнера> /bin/bash


4. остановить контейнер
docker stop <id_контейнера>
8 июн 20, 11:40    [22147364]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Вам надо:
1. создать docker volume, там будут храниться данные
docker volume create <pg_volume>


2. запустить контейнер с подключенным volume из п. 1 в папку PGDATA
docker run -d --rm  -p 5432:5432 -v pg_volume:/var/lib/postgresql/data   postgres


3. подключиться к контейнеру и ч\з утилиту psql создать бд и все, что Вам надо
id_контейнера - первые несколько цифр(3-4) выведенные в п.2

docker exec -it <id_контейнера> /bin/bash


4. остановить контейнер
docker stop <id_контейнера>



Если я отдам контейре юзеру, он должен будет проделывать шаги 2-4 ? Так не проходит.
Хотелось бы отдать юзеру контейнер, чтобы он запустил контейнер и там уже была база: т.е. пустил это контейнер, пустил приложение, коннектнулся к базе и мог пробовать
8 июн 20, 11:46    [22147366]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Тогда так:

1. стартуете контейнер
docker run -d postgres


2. подключаетесь к контейнеру
docker exec -it <id_контейнера> /bin/bash


3. ч\з psql производите создание, настройку и т.д. БД

4. останавливаете контейнер
docker stop <id_контейнера>


5. создаете из этого контейнера образ (image)
<название_образа> - состоит из названия репозитория где будет храниться образ и тега
docker commit <id_контейнера> <название_образа>


6. надо положить (push) созданный образ в репозиторий для дальнейшего использования другими

После этого можно просто запускать
docker run -d --rm -p 5432:5432  <название_образа>
8 июн 20, 12:01    [22147370]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
о, это уже больше похоже на то, что мне хотелось бы получить.

А если большой скрипт с данными и т.д.? вроде можно как-то так:
1. беру https://hub.docker.com/_/postgres/ с постгресом 12
2. засовываю свой скрипт в существующий контейнер, чтобы он выполнялся всегда на старте
3. сохраняю как новый контейнер.

Вот пункт 2 - как сделать?
8 июн 20, 12:15    [22147375]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
В п.2 Вы просто цепляетесь к запущенному контейнеру, т.е. Вас docker подключит к консоли контейнера.
Дополнительно посмотреть id_контейнера можно командой
docker ps


Еще одна полезная команда, копирование файлов\папок в запущенный контейнер

docker cp /media/guzya/data/Работа_2/PostgresSQL/postgresql-12.1/  <id_контейнера>:/postgres_src/


Скопируйте Ваш скрипт и выполните его.

Еще один момент, для сокращения размеров конечного образа, удаляйте не нужные файлы (Ваш скрипт).
8 июн 20, 12:31    [22147391]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
В п.2 Вы просто цепляетесь к запущенному контейнеру, т.е. Вас docker подключит к консоли контейнера.
Дополнительно посмотреть id_контейнера можно командой
docker ps


Еще одна полезная команда, копирование файлов\папок в запущенный контейнер

docker cp /media/guzya/data/Работа_2/PostgresSQL/postgresql-12.1/  <id_контейнера>:/postgres_src/


Скопируйте Ваш скрипт и выполните его.

Еще один момент, для сокращения размеров конечного образа, удаляйте не нужные файлы (Ваш скрипт).


понял, вот смотрите еще момент:

В этом контейнере
https://hub.docker.com/layers/postgres/library/postgres/12.3-alpine/images/sha256-a9ae8fdf8709010fece3cf27c8bd283c8a9b49c6033e04e3a273a9584c91df6c?context=explore

Написано:
ADD file ... in /
CMD ["/bin/sh"]
/bin/sh -c set -eux; addgroup
ENV LANG=en_US.utf8
/bin/sh -c mkdir /docker-entrypoint-initdb.d

Так вот это
/docker-entrypoint-initdb.d

Туда можно поместить свой скрипт?
8 июн 20, 12:48    [22147402]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Видимо оно

Initialization scripts
8 июн 20, 13:01    [22147416]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Тогда так:

1. стартуете контейнер
docker run -d postgres


2. подключаетесь к контейнеру
docker exec -it <id_контейнера> /bin/bash


3. ч\з psql производите создание, настройку и т.д. БД

4. останавливаете контейнер
docker stop <id_контейнера>


5. создаете из этого контейнера образ (image)
<название_образа> - состоит из названия репозитория где будет храниться образ и тега
docker commit <id_контейнера> <название_образа>


6. надо положить (push) созданный образ в репозиторий для дальнейшего использования другими

После этого можно просто запускать
docker run -d --rm -p 5432:5432  <название_образа>




где-то я торможу: все делаю как написано, но сделав пункт 4 не могу сделать коммит, пишет нет такого контейнера, и
>docker ps
пусто
8 июн 20, 13:14    [22147425]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Покажите команду запуска, в ней НЕ должно быть --rm .

Посмотреть все запущенные\выключенные контейнеры можно

docker ps -a
8 июн 20, 13:24    [22147430]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Покажите команду запуска, в ней НЕ должно быть --rm .

Посмотреть все запущенные\выключенные контейнеры можно

docker ps -a


Здесь целая туча всяких моих докеров
docker ps -a

Пускал так:
docker run -it --name pgalp --rm -e POSTGRES_PASSWORD=postgres -p5401:5432 postgres:12.3-alpine
8 июн 20, 13:29    [22147433]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Ролг Хупин, так попробуйте

docker run -it --name pgalp -e POSTGRES_PASSWORD=postgres -p 5401:5432 postgres:12.3-alpine


Если у Вас linux, можно так грохнуть все выключенные контейнеры

docker rm $(docker ps -aq)
8 июн 20, 13:33    [22147438]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Ролг Хупин, так попробуйте

docker run -it --name pgalp -e POSTGRES_PASSWORD=postgres -p 5401:5432 postgres:12.3-alpine


Если у Вас linux, можно так грохнуть все выключенные контейнеры

docker rm $(docker ps -aq)


Windows.
понял, надо убрать флаг удаления rm.
8 июн 20, 13:35    [22147440]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Попробуйте для удаления всех контейнеров

docker ps -aq | docker rm
8 июн 20, 13:38    [22147443]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Попробуйте так собрать образ:

1. создайте в папке с нужным скриптом файл с названием Dockerfile и содержимым
FROM postgres:12.3-alpine
COPY <Ваш_файл> /docker-entrypoint-initdb.d/


Желательно, что бы в этой папке больше ни чего не было.

2. после этого в терминале в директории с файлом запустите сборку
docker build .  -t <название_образа>


Точка "." в команде обязательна (указание на текущую папку).

3. проверяйте, что образ собран
docker image ls


4. пробуйте

Сообщение было отредактировано: 8 июн 20, 13:47
8 июн 20, 13:47    [22147454]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Попробуйте для удаления всех контейнеров

docker ps -aq | docker rm


так не прошло, сделал так
PowerShell> docker ps -aq | foreach {docker rm $_}
8 июн 20, 13:51    [22147456]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Попробуйте так собрать образ:

1. создайте в папке с нужным скриптом файл с названием Dockerfile и содержимым
FROM postgres:12.3-alpine
COPY <Ваш_файл> /docker-entrypoint-initdb.d/


Желательно, что бы в этой папке больше ни чего не было.

2. после этого в терминале в директории с файлом запустите сборку
docker build .  -t <название_образа>


Точка "." в команде обязательна (указание на текущую папку).

3. проверяйте, что образ собран
docker image ls


4. пробуйте




Уперся в свою же идею

Сделал скрипт, который по идее надо бы запустить

create database pm_db;
-- <-----------------------переключиться на созданную базу?
create table params
(
id int not null primary key,
name text
);

insert into params(id, name) values(0, 'value 1');
insert into params(id, name) values(1, 'value 2');


Но после создания базы надо бы в ней создать таблицу, т.е. переключить конекст?
8 июн 20, 14:23    [22147478]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Сделайте где-нибудь бд и слейте pg_dump-ом бэкап, собственно его и подсовывайте.

Я провел эксперимент использовав в качестве скрипта Демонстрационная база данных с postgrespro
и Dockerfile
FROM postgres:12.3-alpine
COPY demo-small-20170815.sql /docker-entrypoint-initdb.d/


Работает, но у Вас каждый раз при старте контейнера, будет идти эта долгая процедура инициализации.
Если этого не нужно, то уже этот запущенный и проинициализированный контейнер и надо закомитить в образ.

Сообщение было отредактировано: 8 июн 20, 14:36
8 июн 20, 14:37    [22147482]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Только из бэкапа удалите команду DROP DATABASE ....; , а то скрипт на ней падает.

По поводу переключения контекста

--
-- PostgreSQL database dump
--

...................................................
DROP DATABASE demo;  -- надо удалить


CREATE DATABASE demo;

\connect demo

...................................................
8 июн 20, 14:42    [22147484]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Попробуйте так собрать образ:

1. создайте в папке с нужным скриптом файл с названием Dockerfile и содержимым
FROM postgres:12.3-alpine
COPY <Ваш_файл> /docker-entrypoint-initdb.d/


Желательно, что бы в этой папке больше ни чего не было.

2. после этого в терминале в директории с файлом запустите сборку
docker build .  -t <название_образа>


Точка "." в команде обязательна (указание на текущую папку).

3. проверяйте, что образ собран
docker image ls


4. пробуйте


Прошел всю инструкцию, получил, что хотел.
Построил свой образ на основе существующего + мой скрипт, потом запустил новый - новая база с таблицей и данными там есть!!!
Спасибо за офигенную помощь. :-)

PS. Теперь, конечно, тянет найти решение: чтобы данные юзера осохранялись между стартами этого докера
8 июн 20, 14:46    [22147486]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Это тот самый docker volume (это по красивому), а еще можно без volume, просто папку монтировать причем ч\з те же ключи.
8 июн 20, 14:56    [22147491]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Guzya
Это тот самый docker volume (это по красивому), а еще можно без volume, просто папку монтировать причем ч\з те же ключи.


ага, если я правильно понимаю:
запускаю докер и указываю мэп той директории в докере, где постгрес держит базу -> на какой-то внешний фолдер на хосте.
И когда стартует докер, то все, что будет создаваться в директории в докере будет видно во внешнем фолдере?
И рестартуя докер постгрес будет подхватывать те файлы, которые уже есть в мэпнутом фолдере?
Получается достаточно мэпнуть директорию с базой и практически - всё сделано?
8 июн 20, 15:03    [22147496]     Ответить | Цитировать Сообщить модератору
 Re: Docker+PostgreSQL+база  [new]
Guzya
Member

Откуда:
Сообщений: 556
Мап указывается при старте контейнера, например:
Ваш текущий образ имеет некую дефолтную бд с дефолтными данными "зашитыми" в образ

- при старте просто контейнера без мапа вы получите эти данные,

- при старте контейнера с мапом на volume\директорию в нее автоматом запишутся данные из точки монтирования+все новое, что будет писаться в эту
директорию. После выключения\уничтожения контейнера информация будет сохранена.

- если Вы снова хотите получить дефолтные данные, Вы просто стартуете контейнер без мапа или мапируете другие volume\директорию



Например Вы можете написать скрипт, в котором будет проверяться имеется ли на машине некий volume
, если нет, то создавать его, а дальше уже запускать контейнер с мапом на этот volume.
Просмотр имеющихся volume
docker volume ls

Информация по конкретному volume
docker volume inspect <volume>
8 июн 20, 15:18    [22147503]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / PostgreSQL Ответить