在 docker 文件中将 postgress 连接添加到 pgadmin

Pav*_*fer 6 pgadmin docker pgadmin-4

有没有办法用一些服务器连接预先配置 pgadmin(可能通过 env 变量)?

假设你有这个 docker-compose.yml,比如PGADMIN_CONNECTIONS这个例子中的 env 变量?(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

Run Code Online (Sandbox Code Playgroud)

小智 16

This config works for me:

  • postgres_db_data/
  • pgpass
  • servers.json
  • docker-compose.yaml
  1. create an empty dir call postgres_db_data

  2. create "pgpass" with the following contents

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

  1. create "servers.json" with the following contents
{
  "Servers": {
    "1": {
      "Name": "docker_postgres",
      "Group": "docker_postgres_group",
      "Host": "host.docker.internal",
      "Port": 15432,
      "MaintenanceDB": "postgres",
      "Username": "postgres",
      "PassFile": "/pgpass",
      "SSLMode": "prefer"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. create "docker-compose.yaml" with the following contents
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"
Run Code Online (Sandbox Code Playgroud)
  1. run docker compose up

  2. open http://localhost:5050/browser/

  • 当尝试在 pgadmin 界面中打开服务器时,我收到“fe_sendauth:未提供密码”。据我所知,这可能是因为 pgpass 文件的权限,但由于我在 Windows 上,我不知道如何解决这个问题 (3认同)

Tob*_*ist 7

避免在 UI 中输入任何登录/连接信息/密码

这是一个独立的 docker-compose 文件。您不需要创建任何其他文件。

注意:需要Docker Compose 版本 2.23.1或更高版本(用于Compose 规范 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"
      }}}
Run Code Online (Sandbox Code Playgroud)
  • PGADMIN_CONFIG_SERVER_MODE=False禁用 pgadmin4 登录屏幕。
  • PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=False禁用登录屏幕时无需输入主密码。
  • 不使用host.docker.internal,这意味着它可以在 Linux 上开箱即用。
  • 修复了fe_sendauth: no password supplied前面示例中的错误,您需要第一次手动输入 postgres 密码。


小智 6

您需要定义一个servers.json 文件来配置连接。这里有很好的记录。

容器内的默认路径是/pgadmin4/servers.json. 您可以COPY将自己的 server.json 文件版本转换为新构建的映像,也可以在运行时将文件绑定挂载到容器中。

密码不能通过 JSON 传递给 pgadmin,但在下面的示例中引用了包含密码的文件。有关更多信息,请参见下文。

server.json文件的示例结构如下:

{
  "Servers": {
    "1": {
      "Name": "pgadmin4@pgadmin.org",
      "Group": "Servers",
      "Host": "magic_db",
      "Port": 5432,
      "MaintenanceDB": "postgres",
      "Username": "postgres",
      "PassFile": "/pgpass",
      "SSLMode": "prefer"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

/pgpass要求的结构如下:

hostname:port:database:username:password
Run Code Online (Sandbox Code Playgroud)

因此,对于上面的示例,它将是:

magic_db:5432:postgres:postgres:secretpassword
Run Code Online (Sandbox Code Playgroud)

注:密码改为密码文件中的pgAdmin新版本所看到这里

  • 它在 pgadmin docker 文件中没有很好地记录,因为它不包含答案中实际需要的信息,例如 json 文件的结构。对于阅读此 Jay 在 passfile 上的第二个链接的其他人,还包含 server.json 文件可用的所有属性的完整示例。谢谢杰伊。 (3认同)
  • 这似乎仅适用于默认的 pgadmin 用户。这些服务器不会向其他用户显示。因此,我尝试使用“共享”标志,它对所有用户都可见,但它不会预先填充用户名和密码。每个用户必须再次手动提供用户名和密码文件 (2认同)