我正在尝试对使用 postgresql 的 Spring Boot 应用程序进行 dockerize,所以我在执行cp target/ docker -spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/ docker之后首先运行./mvnw clean package -DskipTests
这是我的代码
docker-compose.yml
version: '2'
services:
app:
image: 'demo:latest'
build:
context: .
container_name: app
depends_on:
- db
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgreTest
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=B123456789
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
db:
image: 'postgres:alpine'
container_name: db
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=B123456789
文件
FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} application.jar
ENTRYPOINT ["java", "-jar", "application.jar"]
application.props
spring.datasource.url=jdbc:postgresql://db:5432/postgreTest?serverTimezone=UTC
spring.datasource.username=postgres
spring.datasource.password=B123456789
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
但我不断收到同样的错误
2021-07-16 15:25:31.986 WARN 1 --- [main] ohejeiJdbcEnvironmentInitiator:HHH000342:无法获得查询元数据应用程序的连接| 应用程序| org.postgresql.util.PSQLException: 与 db:5432 的连接被拒绝。检查主机名和端口是否正确以及 postmaster 是否正在接受 TCP/IP 连接。
多么好的问题啊!乍一看你的配置,我看不出任何明显错误的地方。我相信您可能db
在postgres
完全启动之前尝试连接到您的。
如果这是问题所在,您很可能会被建议不要使用原始文件depends_on
(它只会等到container
它本身启动,而是depends_on
带有条件和healthcheck
.
有了这种方法,你请务必检查是否postgres
是真正的开始,不只是容器,但数据库本身。即您可以执行以下操作:
// ...
services:
postgres:
// ...
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 1s
app:
//... do your springboot app stuff here
depends_on:
postgres:
condition: service_healthy
您在评论中提到,现在您收到另一个错误,说它找不到您的数据库。这很可能是因为在postgres
进程本身启动时,您的 jdbc 连接字符串所引用的数据库并未创建。
默认情况下,postgres
您开箱即用的数据库是:
template0
template1
postgres
另请参阅此链接以获取更多信息。
由于您的jdbc
字符串连接/期望连接到另一个数据库: jdbc:postgresql://db:5432/postgreTest
,您很可能需要事先创建该数据库。
postgreTest
预先创建数据库?嗯,有多种方法:
docker-y
:确保您的容器在启动时具有您需要的数据库。这是我将在下面描述如何做的。postgres-docker 容器支持多种属性,此外还有:
POSTGRES_USER=xyz
POSTGRES_PASSWORD=xxxxx
您还可以使用该属性覆盖创建的默认数据库名称(postgres
如果您的用户也是postgres
)POSTGRES_DB
。文档中写道:
此可选环境变量可用于为首次启动映像时创建的默认数据库定义不同的名称。如果没有指定,则该值
POSTGRES_USER
将被使用
基本上,你会做这样的事情:
db:
image: 'postgres:alpine'
container_name: db
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 1s
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=B123456789
- POSTGRES_DB=postgreTest
这将最终创建您的数据库,等待它完全启动(由于健康检查),然后也创建postgresTest
数据库,然后才被认为是健康的。然后你的 spring 应用程序将拥有它的所有依赖项,并准备开始。
注意:顺便说一句,我注意到您使用version 2
了撰写规范,我会切换到最新的 3,因为 2(和 1)非常笨重,并且通常不允许在新规范版本中很容易实现某些可能性.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句