使用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¤tSchema=$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 <container_name> bash
启动查询控制台psql
定义密码ALTER ROLE postgres WITH PASSWORD 'your_pwd'
容器管理:
向上——docker-compose up --remove-orphans --force-recreate --build PostgreSQL
【讨论】:
Ashok你猜猜发生了什么?!? 没找到你吗? 为什么会出现这种行为? 我不确定,但是当我遇到这个问题时,我尝试了这种方式,它对我有用 它再也没有发生过?以上是关于使用docker部署的postgresql镜像在运行一段时间后无法验证spring应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 docker 镜像中安装 postgresql?