Docker dpage/pgadmin4 error: specified user does not exist

Docker dpage/pgadmin4 error: specified user does not exist

这是 docker-compose.yml 文件:

version: '3'

services:
############################
# Setup database container #
############################
  postgres_db:
    image: postgres
    restart: always
    ports:
      - ${POSTGRES_PORT}:${POSTGRES_PORT}
    environment: 
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - PGDATA=/var/lib/postgresql/data/pgdata
      - POSTGRES_DB=${POSTGRES_DB}
    volumes:
      - ./data:/var/lib/postgresql/data 
    networks:
      - db_network

  pgadmin:
    image: dpage/pgadmin4:4.19
    restart: always
    ports:
      - 8001:8080/tcp
    environment: 
      - PGADMIN_LISTEN_ADDRESS=0.0.0.0
      - PGADMIN_LISTEN_PORT=8080
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
    networks:
      - db_network

networks: 
  db_network:
    driver: bridge

同一目录下有.env个文件。

# The above refers to the name of the postgres container since using docker-compose
# This is because docker-compose creates a user-defined network. Kubernetes also does this.
POSTGRES_PORT=5432
POSTGRES_USER=website
POSTGRES_PASSWORD=website
POSTGRES_DB=wikifakes_main
PGADMIN_DEFAULT_EMAIL=info@my-website.com
PGADMIN_DEFAULT_PASSWORD=my-secure-password 

当执行 docker-compose up --build 时,docker 都会启动,我可以通过 localhost:8001 访问 pgAdmin4 网站。 但是,输入凭据后,我得到以下响应:

Specified user does not exist

为什么指定的用户不存在,我应该如何更改我的环境才能登录?

通过 docker run --rm -e PGADMIN_DEFAULT_EMAIL="info@my-website.com" -e PGADMIN_DEFAULT_PASSWORD="my-secure-password" -p 8001:80 dpage/pgadmin4 创建的 pgadmin4 docker 上的登录工作正常。

tty: true 添加到 docker-compose.yml 文件中的 pgadmin 服务。


  pgadmin:
    image: dpage/pgadmin4:4.19
    restart: always
    ports:
      - 8001:8080/tcp
    environment: 
      - PGADMIN_LISTEN_ADDRESS=0.0.0.0
      - PGADMIN_LISTEN_PORT=8080
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
    networks:
      - db_network
    # ADD THIS LINE
    tty: true

因此完整的文件如下所示:

version: '3'

services:
############################
# Setup database container #
############################
  postgres_db:
    image: postgres
    restart: always
    ports:
      - ${POSTGRES_PORT}:${POSTGRES_PORT}
    environment: 
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - PGDATA=/var/lib/postgresql/data/pgdata
      - POSTGRES_DB=${POSTGRES_DB}
    volumes:
      - ./data:/var/lib/postgresql/data 
    networks:
      - db_network

  pgadmin:
    image: dpage/pgadmin4:4.19
    restart: always
    ports:
      - 8001:8080/tcp
    environment: 
      - PGADMIN_LISTEN_ADDRESS=0.0.0.0
      - PGADMIN_LISTEN_PORT=8080
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
    networks:
      - db_network
    # ADD THIS LINE, TO BE ABLE TO LOGIN
    tty: true

networks: 
  db_network:
    driver: bridge

tty 不是必需的,但您需要提及依赖项(depends_on 和链接)!

version: '3.1'

services:
############################
# Setup database container #
############################
  postgres_db:
    image: postgres
    restart: always
    ports:
      - ${POSTGRES_PORT}:${POSTGRES_PORT}
    environment: 
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - PGDATA=/var/lib/postgresql/data/pgdata
      - POSTGRES_DB=${POSTGRES_DB}
    volumes:
      - ./data:/var/lib/postgresql/data 
    networks:
      - db_network

  pgadmin:
    image: dpage/pgadmin4:4.19
    restart: always
    ports:
      - 8001:8080/tcp
    environment: 
      - PGADMIN_LISTEN_ADDRESS=0.0.0.0
      - PGADMIN_LISTEN_PORT=8080
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
    networks:
      - db_network
    # ADD THIS LINE, TO BE ABLE TO LOGIN
    tty: true
    depends_on: # <-- !!!!!
      - postgres_db # <-- !!!!!
    links: # <-- !!!!!
      - postgres_db # <-- !!!!!

删除/var/lib/pgadmin/pgadmin4.db(它可能安装到某个地方)或尝试在容器内删除它并再次运行。

您的问题很可能是因为您启动了容器,然后更改了 PGADMIN_DEFAULT_EMAILPGADMIN_DEFAULT_PASSWORD

您的容器启动时有一段代码

if [ ! -f /var/lib/pgadmin/pgadmin4.db ]; then

当容器第一次启动时,它会创建一个名为/var/lib/pgadmin/pgadmin4.db的文件。 PGADMIN_DEFAULT_EMAILPGADMIN_DEFAULT_PASSWORD 将存储在 pgadmin4.db 中(密码经过哈希处理)。

所以,当容器再次启动时,pgadmin4.db文件已经创建,不会去上面代码段中的分支,这样PGADMIN_DEFAULT_EMAILPGADMIN_DEFAULT_PASSWORD变化就不会发生待更新。


或者,您可以对容器执行shell

[user:host ~]$ docker exec -it <your container> sh

并检查注册的电子邮件

[pgadmin:<container_id> /pgadmin4]$ cat /var/lib/pgadmin/pgadmin4.db | egrep '\S+@\S+\.\S+'