Как засунуть pg_data-бекап в docker-контейнер
Предисловие
Этот пост написан скорее для меня самого, чем для случайно забредших сюда.
Иногда админы, которых попросили скинуть бекап с какого-нибудь стенда, радостно кидают архивчик и говорят: “Сделано”. А в архиве вместо православного pg_dump’а лежит богомерзкая папка pg_data.
Но проблема в том, что накатывание этого даже без докера не всегда удобно. Благо что базёна при dockerway-разработке всего одна на инстанс pg, поэтому разбираться с внутренним устройством pg_data не приходится.
Накатываем
Ищем, куда копировать
Я при разработке использую docker-compose, поэтому плясать буду от него.
Для начала получаем ID нужного контейнера. Допустим, в docker-compose.yml он у меня назван postgres
:
$ docker-compose ps -q postgres
Далее для полученного ID надо получить путь до volume’а, в котором хранится pg_data:
$ docker inspect -f '{{ .Mounts }}' <id контейнера>
Получаем что-то вроде
[{volume ea8997003c8f70cb8590754b882f644ad4a29c9bdd2074c4799e150a99d5eada /var/lib/docker/volumes/ea8997003c8f70cb8590754b882f644ad4a29c9bdd2074c4799e150a99d5eada/_data /var/lib/postgresql/data local rw true }]
где
/var/lib/docker/volumes/ea8997003c8f70cb8590754b882f644ad4a29c9bdd2074c4799e150a99d5eada/_data
— наше искомое значение.
Копируем и накатываем права
Перед процедурой желательно тормознуть все контейнеры:
$ docker-compose stop
Для полученной директории с pg_data:
- копируем куда-нибудь действующие конфиги
postgresql.conf
иpg_hba.conf
- удаляем всё содержимое папки
- копируем полное содержимое pg_data из архива
- заменяем конфиги
postgresql.conf
иpg_hba.conf
теми, что мы сохранили в первом пункте.
На всякий случай регулярка для pg_hba.conf
чтобы всё разрешить:
# sed -i "s/md5\|reject\|trust\|password\|gss\|sspi/trust/g" <путь до pg_data>/pg_hba.conf
Так как на стенде имя БД и права скорее всего не совпадают с локальными, надо будет заходить и править это дело руками. Для этого стартуем контейнер с БД и меняем все нужные права/названия. Например:
$ docker-compose start postgres
$ docker-compose exec postgres bash
# psql -U postgres
postgres-# ALTER USER postgres PASSWORD null;
postgres-# \l
postgres-# ALTER DATABASE <продовое название БД> RENAME TO <локальное название БД>;
postgres-# ALTER DATABASE <локальное название БД> OWNER TO postgres;
Готово! Вы восхитительны!