使用docker部署的postgresql镜像在运行一段时间后无法验证spring应用程序

Posted

技术标签:

【中文标题】使用docker部署的postgresql镜像在运行一段时间后无法验证spring应用程序【英文标题】:postgresql image deployed with docker fails to authenticate spring applications after running for a while 【发布时间】:2021-01-27 18:23:47 【问题描述】:

我有一个使用 spring boot/cloud 开发的微服务项目,其中包含至少 14 种不同的服务,并使用 postgresql docker 映像作为数据库。 当使用 docker compose 部署到 prod env 时,一切都像魅力一样,这是我的 docker compose:

    version: '3.7'
    volumes:
      db-data:
        name: db-data
    services:
      db:
        image: 'postgres:11.5'
        command: postgres -c 'max_connections=200'
        container_name: postgres
        ports:
          - '5432:5432'
        volumes:
          - 'db-data:/var/lib/postgresql/data'
        environment:
          POSTGRES_PASSWORD: postgres
  auth:
    container_name: auth
    image: auth
    environment:
      JAVA_OPTS: '-Xmx500m -XX:+UseSerialGC -Xss512k -XX:MaxRAM=72m'
      SPRING_PROFILES_ACTIVE: prod
    build:
      context: ./auth
      dockerfile: DockerFile
    ports:
      - '9100:9100'
    depends_on:
      - db

这是我的 application-prod.yml 服务示例:

    spring:
      datasource:
    hikari:
      maximum-pool-size: 4
    url: jdbc:postgresql://postgres:5432/postgres?ApplicationName=$spring.application.name&currentSchema=$app.database.schema-name
    driver-class-name: org.postgresql.Driver
    username: postgres
    password: postgres
  jpa:
    open-in-view: false
    show-sql: true
    hibernate.ddl-auto: create
    generate-ddl: true
    properties:
      hibernate:
        jdbc:
          lob:
            non_contextual_creation: true
  output:
    ansi:
      enabled: detect

现在在部署 2 或 3 天后,postgres 容器开始显示此日志:

我的所有服务都显示此日志:

org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"
        at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:475) ~[postgresql-42.2.1.jar!/:42.2.1]
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:207) ~[postgresql-42.2.1.jar!/:42.2.1]
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) [postgresql-42.2.1.jar!/:42.2.1]
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195) [postgresql-42.2.1.jar!/:42.2.1]
        at org.postgresql.Driver.makeConnection(Driver.java:452) [postgresql-42.2.1.jar!/:42.2.1]
        at org.postgresql.Driver.connect(Driver.java:254) [postgresql-42.2.1.jar!/:42.2.1]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:365) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:194) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:460) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:697) [HikariCP-2.7.8.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:683) [HikariCP-2.7.8.jar!/:na]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_111]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]

我不知道为什么,一切正常,谁能帮我弄清楚为什么会这样?

【问题讨论】:

也许有人使用您非常容易猜到的密码登录,然后更改了该密码。把你锁在外面。 @jjanes 我知道我很难过 prod 环境,但这实际上是一个 pre-prod 环境,供 QA ppl 确保一切正常,所以我向你保证不是安全问题 很难看出还会发生什么。只要它暴露在不受信任的网络中(或者受信任网络上的任何人都不是真正值得信赖的),就不必担心它会出现安全问题。这是可重复的还是一次性问题? 这在重新部署后每 1-2 天发生一次,我如何解决这个问题是我登录到容器并使用“psql”和“\password”为同一用户重新定义相同的旧 有时会发生或根本无法连接@Dever 【参考方案1】:

尝试为用户 Postgres 定义密码

    docker ps

    docker exec -it &lt;container_name&gt; bash

    启动查询控制台psql

    定义密码ALTER ROLE postgres WITH PASSWORD 'your_pwd'

容器管理:

向上——docker-compose up --remove-orphans --force-recreate --build PostgreSQL

【讨论】:

Ashok你猜猜发生了什么?!? 没找到你吗? 为什么会出现这种行为? 我不确定,但是当我遇到这个问题时,我尝试了这种方式,它对我有用 它再也没有发生过?

以上是关于使用docker部署的postgresql镜像在运行一段时间后无法验证spring应用程序的主要内容,如果未能解决你的问题,请参考以下文章

云原生之使用docker部署Postgresql数据库

DolphinScheduler 之Docker 部署

如何更改 Postgresql docker 镜像密码

如何在我的 docker 镜像中安装 postgresql?

centos7使用supermin制作centos7 Postgresql的docker镜像包

使用 Gradle 和 Docker 部署 Spring Boot/PostgreSQL 项目