Взялась помочь - и вроде сделала, да что-то у меня громоздко выходит, может знающие люди смогут подсказать что можно улучшить-упростить.
Это для сервиса где пользователи смогут решать задачки по SQL конкретно в диалекте Postgres. Нужно чтобы человек мог отправить скрипт со своим запросом (плюс немного CREATE/INSERT строчек к нему добавляется вначале конечно) и мы могли бы проверить результат. Отправка и т.п. - это всё есть, основная сложность в том чтобы изолировать выполнение скриптов, чтобы не повредили систему и не аффектили раз от раза друг друга.
Поковырялась вечер с гуглом и стековерфлоу, получилось вот так - в докере на базе ubuntu делаем (в докерфайле)
DEBIAN_FRONTEND=noninteractive apt install -y postgresql
useradd pguser
mkdir /test
chown pguser /test
chown pguser /var/run/postgresql
su pguser -c '/usr/lib/postgresql/16/bin/initdb -D /test/db'
вот эта штука с initdb выполняется секунд 10-20 поэтому её похоже приходится делать на старте (а можно ли как-то ускорить?)
остальное выполняется каждый раз в сессии (т.е. при получении и выполнении запроса) под пользователем pguser
/usr/lib/postgresql/16/bin/pg_ctl -D /test/db -l /dev/null start >/dev/null 2>&1
createdb
psql -q --csv -c '...' # тут CREATE TABLE; INSERT; SELECT... на самом деле из файла скорее будет выполняться, не важно
dropdb pguser
/usr/lib/postgresql/16/bin/pg_ctl -D /test/db stop
/usr/lib/postgresql/16/bin/pg_resetwal -D /test/db
В принципе это работоспособно, выполняется секунды 3-5 наверное, директория с базой как будто по размеру не растёт.
Сервер запускается и стопается чтобы можно было resetwal сделать да кроме того там не только постгрес в контейнере может тестироваться, так чтоб память не занимал.
Заранее спасибо!
P.S. это конкретно про постгрес, что можно с MySQL или H2 сделать проще (и даже в памяти) это в принципе понятно, но т.к. сейчас постгрес в энтерпрайзе повсеместно то есть желание чтобы условия были "приближенные к реальным".