当该文件作为卷挂载时,pgpass 文件在 pgadmin4 docker 容器中的位置

s.k*_*s.k 9 docker pgadmin-4

我使用以下图像https://hub.docker.com/r/dpage/pgadmin4/在 Ubuntu 18-04 上设置 pgAdmin4。

我已经安装了一个包含文件的卷pgpass(该文件也chmodpgadmin容器内的用户使用),如您在我的 Compose 文件中看到的那样:

version: '3.8'
services:
  pgadmin4:
    image: dpage/pgadmin4
    container_name: pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=me@localhost
      - PGADMIN_DEFAULT_PASSWORD=******************
      - PGADMIN_LISTEN_PORT=5050
      - PGADMIN_SERVER_JSON_FILE=servers.json
    volumes:
      - ./config/servers.json:/pgadmin4/servers.json # <-- this file is well taken into account
      - ./config/pgpass:/pgpass # <- there is no way to find this one on the other hand
    ports:
      - "5000:5000"
    restart: unless-stopped
    network_mode: host
Run Code Online (Sandbox Code Playgroud)

但是,当我右键单击服务器并检查其高级属性时,pgadmin 网页似乎无法识别它:

pgadmin 界面中没有 pgpass 文件

如果我/pgpass在顶部绿色框中手动指定图像中只有斜杠的位置,则会显示:

未找到 pgpass

但是如果我登录到容器,我实际上可以列出该文件:

/ $ ls -larth /pgpass
-rw-------    1 pgadmin  pgadmin      574 Mar 10 22:37 /pgpass
Run Code Online (Sandbox Code Playgroud)

我做错了什么?
如何才能让pgpass应用程序识别该文件?

use*_*582 12

我通过以下见解得到了它。

在servers.json中指定:

"PassFile": "/pgpass"
Run Code Online (Sandbox Code Playgroud)

这意味着/路径从用户的存储目录开始,即

pattern:

/var/lib/pgadmin/storage/<USERNAME>_<DOMAIN>/

example:

/var/lib/pgadmin/storage/postgres_acme.com/
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例,它将所有内容复制到正确的位置并正确设置权限。

pattern:

/var/lib/pgadmin/storage/<USERNAME>_<DOMAIN>/

example:

/var/lib/pgadmin/storage/postgres_acme.com/
Run Code Online (Sandbox Code Playgroud)

  • PassFile 不绝对是非常愚蠢的。为此花费了3个小时 (4认同)

Doğ*_*tay 10

pgAdmin 6.2上,PassFile指向容器内的绝对路径,而不是STORAGE_DIR( /var/lib/pgadmin ) 下的路径。

在入口点阶段之前,只需设置 pgpass 文件的所有者和权限。

docker-compose.yml

  pgadmin:
    image: dpage/pgadmin4:6.2
    entrypoint: >
      /bin/sh -c "
      cp -f /pgadmin4/pgpass /var/lib/pgadmin/;
      chmod 600 /var/lib/pgadmin/pgpass;
      chown pgadmin:pgadmin /var/lib/pgadmin/pgpass;
      /entrypoint.sh
      "
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
      PGADMIN_CONFIG_SERVER_MODE: "False"
      PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: "False"
    volumes:
      - ./config/servers.json:/pgadmin4/servers.json
      - ./config/pgpass:/pgadmin4/pgpass
    ports:
      - "${PGADMIN_PORT:-5050}:80"
Run Code Online (Sandbox Code Playgroud)

服务器.json

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

密码

postgres:5432:postgres:postgres:Welcome01
Run Code Online (Sandbox Code Playgroud)

更新:

更新了docker-compose.yml上的入口点和servers.json上的 PassFile ,以实现跨平台工作解决方案。

更新2:

我为无密码 pgadmin4 创建了一个容器映像 ( dcagatay/pwless-pgadmin4 )。


小智 8

以下配置对我有用:

  • 密码
  • 服务器.json
  • docker-compose.yaml
  • dockerfile_for_pgadmin

密码

docker_postgres_db:5432:postgres:postgres:postgres
Run Code Online (Sandbox Code Playgroud)

服务器.json

{
  "Servers": {
    "1": {
      "Name": "docker_postgres",
      "Group": "docker_postgres_group",
      "Host": "docker_postgres_db",
      "Port": 5432,
      "MaintenanceDB": "postgres",
      "Username": "postgres",
      "PassFile": "/pgpass",
      "SSLMode": "prefer"
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

docker-compose.yaml

version: "3.9"
services:

  docker_postgres_db:
    image: postgres
    volumes:
      - ./postgres_db_data:/var/lib/postgresql/data # mkdir postgres_db_data before docker compose up
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "15432:5432"


  pgadmin:
     build:
       context: .
       dockerfile: ./dockerfile_for_pgadmin
     environment:
       PGADMIN_DEFAULT_EMAIL: pgadmin@pgadmin.com
       PGADMIN_DEFAULT_PASSWORD: pgadmin
     ports:
       - "5050:80"
     volumes:
       - ./servers.json:/pgadmin4/servers.json # preconfigured servers/connections
Run Code Online (Sandbox Code Playgroud)

dockerfile+for_pgadmin

FROM dpage/pgadmin4
USER pgadmin
RUN mkdir -p  /var/lib/pgadmin/storage/pgadmin_pgadmin.com
COPY ./pgpass /var/lib/pgadmin/storage/pgadmin_pgadmin.com/
USER root
RUN chown pgadmin:pgadmin /var/lib/pgadmin/storage/pgadmin_pgadmin.com/pgpass
RUN chmod 0600 /var/lib/pgadmin/storage/pgadmin_pgadmin.com/pgpass
USER pgadmin
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)


小智 4

这里的问题似乎是'/'servers.json文件中并不意味着'/'在文件系统中,而是与STORAGE_DIR配置中的设置相关的东西。事实上,为每个用户创建了一个单独的存储目录,因此对于您的用户,me@localhost您必须挂载./config/pgpass/var/lib/pgadmin4/storage/me_localhost/pgpass,但仍然/pgpass在您的servers.json.