postgresql - 使用预先配置的服务器在 docker 中运行 pgadmin4

标签 postgresql docker pgadmin-4

我希望以某种方式在我们的基础架构中运行 pgadmin4,postgres 服务器将在 docker build/1.st 启动期间预先配置。

我试图在 1.st 开始时修改内部使用的 /var/lib/pgadmin/pgadmin4.db sqlite DB,但是这会导致 UI 出错(一旦选择特定的 postgres 服务器:

definition of service "" not found

我试过以下方法:

目录结构:

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 脚本。

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 docker 容器的任何其他方法?

最佳答案

image dpage/pgadmin 的当前版本是 4.24。这个版本有 support服务器定义列表(servers.json)的外部配置:

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

卷绑定(bind)可以配置如下:

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

第一次启动容器时,服务器组和服务器将自动配置。

更新。 JSON 格式有更多的可选字段。重要的是 password can not be imported/exported由于明显的安全原因,以这种方式。

关于postgresql - 使用预先配置的服务器在 docker 中运行 pgadmin4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49912904/

相关文章:

docker - 为什么 docker-compose 没有像预期的那样使用端口绑定(bind)?

postgresql - 如何将大型 csv 文件(~4GB)导入 PostgreSQL 数据库?

postgresql - 只能将pgadmin连接到端口5432上的postgres docker容器,但不能连接任何其他端口?

database - 可以直接从数据库查询 Asterisk CEL 信息吗? (PostgreSQL)

sql - Postgres 使用跨 3 个表的内部连接进行更新?

node.js - 如何动态更改查询的值

php - 无法在 mac 上退出 PSQL (`which psql` 转到 `/usr/local/php5/bin/psql` )这很奇怪

docker - Buildmaster 不监听端口

Docker/Node-red - 如果卷在 USB 闪存驱动器上,npm 无法安装调色板

postgresql - 在 pgadmin4 中使列可编辑