Запуск pgadmin4 в докере с предварительно настроенными серверами

Я хотел бы запустить pgadmin4 в нашей инфраструктуре таким образом, чтобы серверы postgres были предварительно сконфигурированы во время запуска docker build/1.st.

Я пытался изменить используемые внутренние /var/lib/pgadmin/pgadmin4.db sqlite DB при первом запуске, что, однако, приводит к ошибке в пользовательском интерфейсе (после выбора конкретного сервера postgres:

определение услуги "" не найдено

Я попробовал следующее:

Структура каталогов:

find ./  -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'       
|____
|____dump
| |____servergroup.csv
| |____server.csv
| |____import_db.sh
|____Dockerfile

куда Dockerfile является:

cat Dockerfile
# rebuild:
# docker build -t pgadmin4:3.0-custom .
# run:
# docker run --rm -it -e PGADMIN_DEFAULT_EMAIL=admin -e PGADMIN_DEFAULT_PASSWORD=admin -p8081:80 docker build -t pgadmin4:3.0-custom

FROM dpage/pgadmin4:3.0

COPY dump/ /dump

RUN \
    apk add --no-cache sqlite && \
    chmod +x /dump/import_db.sh && \
    # re rely on the current entrypoint.sh impl
    sed -i '/python run_pgadmin.py/a   \/dump\/import_db.sh' /entrypoint.sh && \
    cat /entrypoint.sh

Фактически он просто изменяет https://github.com/postgres/pgadmin4/blob/master/pkg/docker/entrypoint.sh для запуска import_db.sh скрипт на 1й старт.

куда dump/import_db.sh является:

cat dump/import_db.sh
#!/bin/sh

echo ".tables" | sqlite3 -csv /var/lib/pgadmin/pgadmin4.db

# remove header and `1,1,Servers` entry (would cause duplicates)
cat /dump/servergroup.csv | sed '1d' | grep -v 1,1,Servers > /tmp/servergroup.in.csv
echo "csv servergroup:"
cat /tmp/servergroup.in.csv

echo "DB servergroup:"
sqlite3 -csv -header /var/lib/pgadmin/pgadmin4.db "select * from servergroup;"
echo ".import /tmp/servergroup.in.csv servergroup" | sqlite3 -csv /var/lib/pgadmin/pgadmin4.db

# remove header
cat /dump/server.csv | sed '1d' > /dump/server.in.csv
echo "csv server:"
cat /dump/server.in.csv

echo "DB server:"
sqlite3 -csv -header /var/lib/pgadmin/pgadmin4.db "select * from server;"
echo ".import /dump/server.in.csv server" | sqlite3 -csv /var/lib/pgadmin/pgadmin4.db

Содержимое CSV-файлов:

cat dump/server.csv 
id,user_id,servergroup_id,name,host,port,maintenance_db,username,password,role,ssl_mode,comment,discovery_id,hostaddr,db_res,passfile,sslcert,sslkey,sslrootcert,sslcrl,sslcompression,bgcolor,fgcolor,service
1,1,2,servername,localhost,5432,postgres,postgres,"",,prefer,,,"","",,<STORAGE_DIR>/.postgresql/postgresql.crt,<STORAGE_DIR>/.postgresql/postgresql.key,,,0,,,

cat dump/servergroup.csv
id,user_id,name
2,1,my-group
1,1,Servers

Есть идеи, как исправить мою ошибку? Или любой другой подход, который мог бы предоставить мне предварительно сконфигурированный контейнер докера pgadmin4?

1 ответ

Решение

Выглядит это изменить service значение столбца в пустую строку вместо NULL.

Можете ли вы попробовать обновить значение service столбец в NULL

sqlite> UPDATE server SET service = NULL;

зафиксируйте изменения и перезапустите pgAdmin4 и попробуйте снова подключиться к этому серверу.

Текущая версия image dpage/pgadmin - 4.24. Эта версия поддерживает внешнюю настройку списка определений серверов (server.json):

{
    "Servers": {
        "test": {
            "Name": "test",
            "Group": "Servers",
            "Port": 5432,
            "Username": "postgres",
            "Host": "postgres",
            "SSLMode": "prefer",
            "MaintenanceDB": "postgres"
        }
    }
}

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

volumes:
    - ./servers.json:/pgadmin4/servers.json

При первом запуске контейнера группы серверов и серверы будут настроены автоматически.

Другие вопросы по тегам