在 Docker 文件中添加 PostgreSQL 连接到 pgAdmin。

22

有没有一种方法可以通过预配置pgadmin(可能通过环境变量)来连接到某些服务器?

比如你有一个类似于docker-compose.yml的文件,在这个例子中,PGADMIN_CONNECTIONS环境变量是什么?(PGADMIN_CONNECTIONS可能不是有效的ENV变量,这只是一个举例)

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: dbuser
      POSTGRES_PASSWORD: dbpass
      POSTGRES_DB: TEST_SM

  pgadmin:
    image: dpage/pgadmin4
    ports:
      - "80:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
      PGADMIN_DEFAULT_PASSWORD: admin

      ??PGADMIN_CONNECTIONS: dbuser:dbpass@postgres:5432


1
https://github.com/thaJeztah/pgadmin4-docker/issues/26#issuecomment-354291987 可能会对您有所帮助。 - Radix
3个回答

28

你需要定义一个 servers.json 文件来配置连接。这里有非常详细的文档here

容器内的默认路径是 /pgadmin4/servers.json。你可以通过 COPY 命令将自己的 servers.json 文件复制到新构建的镜像中,或者在运行容器时将该文件挂载到容器中。

密码无法通过 JSON 传递给 pgadmin,但是在下面的示例中引用了包含密码的文件。请参阅下面的详细信息。

下面是 servers.json 文件的示例结构:

{
  "Servers": {
      "1": {
          "Name": "pgadmin4@pgadmin.org",
          "Group": "Servers",
          "Host": "magic_db",
          "Port": 5432,
          "MaintenanceDB": "postgres",
          "Username": "postgres",
          "PassFile": "/pgpass",
          "SSLMode": "prefer"
      }
  }
}
/pgpass 需要以下结构:
hostname:port:database:username:password

所以对于上面的例子,应该是这样的:
magic_db:5432:postgres:postgres:secretpassword

注意:在较新版本的pgadmin中,密码已更改为PassFile,详情请参见此处

9
pgadmin的Docker文件并没有很好地记录这个信息,因为它不包含你回答中实际需要的内容,比如json文件的结构。对于其他人来说,阅读Jay在passfile上的第二个链接也包含了server.json文件中所有可用属性的完整样例。谢谢Jay。 - Dave Pile
2
这似乎只适用于默认的pgadmin用户,这些服务器对其他用户不可见。因此,我尝试使用“共享”标志并且它对所有用户都可见,但它没有预填用户名和密码。每个用户都必须手动再次提供用户名和PassFile。 - Hemanth S. Vaddi
@jayAchar,这对我不起作用。尽管我按照你说的做了同样的事情。 - undefined

15

以下配置适用于我:

  • postgres_db_data/
  • pgpass
  • servers.json
  • docker-compose.yaml
  1. 创建一个名为postgres_db_data的空目录

  2. 创建文件“pgpass”,内容如下:

host.docker.internal:15432:postgres:postgres:postgres

  1. 创建文件“servers.json”,内容如下:
{
  "Servers": {
    "1": {
      "Name": "docker_postgres",
      "Group": "docker_postgres_group",
      "Host": "host.docker.internal",
      "Port": 15432,
      "MaintenanceDB": "postgres",
      "Username": "postgres",
      "PassFile": "/pgpass",
      "SSLMode": "prefer"
    }
  }
}
创建“docker-compose.yaml”文件,并使用以下内容。
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./postgres_db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "15432:5432"
  pgadmin:
     image: dpage/pgadmin4
     restart: always
     environment:
       PGADMIN_DEFAULT_EMAIL: pgadmin@pgadmin.com #the username to login to pgadmin
       PGADMIN_DEFAULT_PASSWORD: pgadmin # the password to login to pgadmin
     ports:
       - "5050:80"
     volumes:
       - ./servers.json:/pgadmin4/servers.json # preconfigured servers/connections
       - ./pgpass:/pgpass # passwords for the connections in this file
     depends_on:
       - "db"
  1. 运行docker compose up

  2. 打开 http://localhost:5050/browser/


2
当我尝试在pgadmin界面中打开服务器时,出现“fe_sendauth:未提供密码”的错误。根据我的阅读,这可能是由于pgpass文件的权限问题,但由于我使用的是Windows系统,我不知道如何解决这个问题。 - ymoreau
1
请看一下我的答案:https://dev59.com/4b_qa4cB1Zd3GeqPQdVm#69258794 - Lincoln D
1
@LincolnD 你的回答非常有帮助!我只需要在这里更改.pgpass文件中的卷大小。此外,我还将该文件中的数据库名称从postgres更改为*,以便能够影响其他数据库。 - Boolean_Type

0
为了避免在用户界面中输入任何登录/连接信息/密码
这是一个单独的自包含的docker-compose文件。您不需要创建任何其他文件。
注意:需要Docker Compose版本2.23.1或更高版本(用于支持在Compose Specification 1.20.1中添加的内联配置)
version: '3.9'

services:
  db:
    image: postgres:16.1
    ports:
      - 5432:5432
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  pgadmin:
    image: dpage/pgadmin4:2023-11-20-2
    ports:
      - 8082:80
    environment:
      - PGADMIN_DEFAULT_EMAIL=postgres@example.com
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_CONFIG_SERVER_MODE=False
      - PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=False
    entrypoint: /bin/sh -c "chmod 600 /pgpass; /entrypoint.sh;"
    user: root
    configs:
      - source: servers.json
        target: /pgadmin4/servers.json
      - source: pgpass
        target: /pgpass

configs:
  pgpass:
    content: db:5432:*:postgres:postgres
  servers.json:
    content: |
      {"Servers": {"1": {
        "Group": "Servers",
        "Name": "My Local Postgres 16.1",
        "Host": "db",
        "Port": 5432,
        "MaintenanceDB": "postgres",
        "Username": "postgres",
        "PassFile": "/pgpass",
        "SSLMode": "prefer"
      }}}
  • PGADMIN_CONFIG_SERVER_MODE=False 禁用了pgadmin4的登录界面。
  • PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=False 在禁用登录界面时,无需输入主密码。
  • 不使用host.docker.internal,这意味着它可以在Linux上直接使用。
  • 修复了之前示例中的fe_sendauth: no password supplied错误,您需要手动输入您的postgres密码第一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接