运行 docker 中的 pgadmin4 具有预配置的服务器
running pgadmin4 in docker with pre-configured servers
我很乐意 运行 pgadmin4 在我们的基础设施中,postgres 服务器将在 docker build/1.st 启动期间预先配置。
我试图在 1.st 启动时修改内部使用的 /var/lib/pgadmin/pgadmin4.db
sqlite 数据库,但是这会导致 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
事实上,它只是在 1.st 开始时将 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 容器的任何其他方法?
看起来这会将 service
列值更改为空字符串而不是 NULL。
您可以尝试将 service
列的值更新为 NULL
sqlite> UPDATE server SET service = NULL;
提交更改并重新启动 pgAdmin4 并再次尝试连接到该服务器。
图像dpage/pgadmin的当前版本是4.24。此版本有 support 用于服务器定义列表的外部配置 (servers.json):
{
"Servers": {
"test": {
"Name": "test",
"Group": "Servers",
"Port": 5432,
"Username": "postgres",
"Host": "postgres",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
}
}
卷绑定可以配置如下:
volumes:
- ./servers.json:/pgadmin4/servers.json
第一次启动容器时会自动配置服务器组和服务器。
我很乐意 运行 pgadmin4 在我们的基础设施中,postgres 服务器将在 docker build/1.st 启动期间预先配置。
我试图在 1.st 启动时修改内部使用的 /var/lib/pgadmin/pgadmin4.db
sqlite 数据库,但是这会导致 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
事实上,它只是在 1.st 开始时将 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 容器的任何其他方法?
看起来这会将 service
列值更改为空字符串而不是 NULL。
您可以尝试将 service
列的值更新为 NULL
sqlite> UPDATE server SET service = NULL;
提交更改并重新启动 pgAdmin4 并再次尝试连接到该服务器。
图像dpage/pgadmin的当前版本是4.24。此版本有 support 用于服务器定义列表的外部配置 (servers.json):
{
"Servers": {
"test": {
"Name": "test",
"Group": "Servers",
"Port": 5432,
"Username": "postgres",
"Host": "postgres",
"SSLMode": "prefer",
"MaintenanceDB": "postgres"
}
}
}
卷绑定可以配置如下:
volumes:
- ./servers.json:/pgadmin4/servers.json
第一次启动容器时会自动配置服务器组和服务器。