【问题标题】:org.postgresql.util.PSQLException: FATAL: role "amigoscode" does not existorg.postgresql.util.PSQLException:致命:角色“amigoscode”不存在
【发布时间】:2022-08-08 00:37:33
【问题描述】:

我是 SpringBoot 的新手。我正在尝试创建一个使用 docker 运行的 spring boot 应用程序。当我运行这个应用程序时,我收到以下错误

org.postgresql.util.PSQLException: FATAL: role \"amigoscode\" does not exist

我没有任何提示,因为我无法追踪此错误。角色“amigoscode”已经存在。我附在 application.yml 和 docker-compose.yml 下面

应用程序.yml

server:
  port: 8080

spring:
  application:
    name: customer
  datasource:
    password: password
    url: jdbc:postgresql://localhost:5432/customer
    username: amigoscode
  jpa:
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: \'true\'
    show-sql: \'true\'

码头工人-compose.yml

services:
  postgres:
    container_name: postgres
    image: postgres
    environment:
      POSTGRES_USER: amigoscode
      POSTGRES_PASSWORD: password
      PGDATA: /data/postgres
    volumes:
      - postgres:/data/postgres
    ports:
      - \"5432:5432\"
    networks:
      - postgres
    restart: unless-stopped

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
      PGADMIN_CONFIG_SERVER_MODE: \'False\'
    volumes:
      - pgadmin:/var/lib/pgadmin
    ports:
      - \"5050:80\"
    networks:
      - postgres
    restart: unless-stopped

networks:
  postgres:
    driver: bridge

volumes:
  postgres:
  pgadmin:

你能指导我吗,我在这里可能做错了什么?我在这里提到了其他类似的问题,但没有一个能解决我的问题。谢谢你。

  • \"角色\"amigoscode\"已经存在\"不,它不存在。 PostgreSQL 不会对此撒谎。如果您的持久卷已经有一个数据库,那么它会被重用,而不是重新创建。如果重用,则 POSTGRES_USER 将被忽略。
  • @jjanes你能告诉我,我在这里做错了什么吗?我无法理解这一点。
  • 你解决了吗?
  • @jjanes 那又怎样?解决方案在哪里?
  • @AnkitOstwal 伙计们,您必须逐步调试,没有人能猜到您的设置中发生了什么。首先,我会进入数据库并检查用户和角色是否真的存在。只需谷歌“psql 列表用户/角色”。如果他们这样做了,那么值得更多地关注 Spring 配置。最好从一个干净的环境开始。

标签: postgresql spring-boot docker docker-compose


【解决方案1】:

当您运行 Postgres 容器并将 POSTGRES_USER 作为环境变量传递时,会运行一个初始化脚本来创建用户。但是,如果文件夹(postgres 卷)已经包含来自旧运行的数据,则会跳过初始化并且不会创建用户。尝试使用新卷并在 postgres 容器启动时检查日志。

【讨论】:

    【解决方案2】:

    您的堆栈定义了变量 POSTGRES_USERPOSTGRES_PASSWORD,其卷为 postgrespostgres 容器只会创建这些用户第一次开始, 但是这个卷之前是否已经创建过,它将重新使用现有数据

    您可能已经使用此卷运行了 postgres 容器,在这种情况下,您需要删除它然后重新创建它,例如:

    # WARNING: this will delete all containers and volumes
    # including pg_data volume and pgadmin volume
    # make sure to make a backup if needed
    docker-compose down -v 
    

    然后重新创建您的容器和卷(以及必要时的其他组件):

    docker-compose up -d
    

    【讨论】:

    • 您的问题似乎与stackoverflow.com/questions/65629281/… 非常相似 - 我在那里接受了我的答案并在这里调整了它:)
    • 没有帮助我,还有其他想法吗?
    • @皮埃尔B。 ,这对我也没有帮助。任何其他输入?
    【解决方案3】:

    请打开 pgAdmin,登录 postgreSQL 并创建新数据库。 Creating new database

    然后命名为“amigoscode”,你就可以开始了。 amgigoscode database

    它对我来说很好。

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2013-02-24
      • 2017-04-16
      相关资源
      最近更新 更多