【发布时间】:2020-10-12 10:18:51
【问题描述】:
我正在尝试将 docker-compose 与 springboot 应用程序(使用 JPA)和 postgres 数据库一起使用,我对使用 docker 有点陌生,但我不知道自己做错了什么。
问题
当我构建 springboot 应用程序时,如果我改变
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres(有效的代码) 将其托管在 postgres 容器中,spring.datasource.url=jdbc:postgresql://postgres:5432/postgres。
它抛出了一个由以下原因引起的 PSQLException:java.net.UnknownHostException: postgres.(下面有更多详细信息)
application.properties
server.port = 8080
## default connection pool
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5
## PostgreSQL
spring.datasource.url=jdbc:postgresql://postgres:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.hibernate.ddl-auto=create
例外
2020-06-22 19:07:10.597 INFO 16088 --- [ main] c.a.a.AnnotationToolApplicationTests : Starting AnnotationToolApplicationTests on DESKTOP-P1E07PA with PID 16088 (started by Pedro in C:\Users\Pedro\git\tfg\annotation-tool\annotation-tool)
2020-06-22 19:07:10.598 INFO 16088 --- [ main] c.a.a.AnnotationToolApplicationTests : No active profile set, falling back to default profiles: default
2020-06-22 19:07:11.584 INFO 16088 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-06-22 19:07:11.719 INFO 16088 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 120ms. Found 3 JPA repository interfaces.
2020-06-22 19:07:12.235 INFO 16088 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-06-22 19:07:12.572 INFO 16088 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-06-22 19:07:12.746 INFO 16088 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {5.4.10.Final}
2020-06-22 19:07:13.002 INFO 16088 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-06-22 19:07:13.434 INFO 16088 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-06-22 19:07:16.873 ERROR 16088 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: The connection attempt failed.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:292) ~[postgresql-42.2.9.jar:42.2.9]
...
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126) ~[surefire-booter-2.22.2.jar:2.22.2]
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418) ~[surefire-booter-2.22.2.jar:2.22.2]
Caused by: java.net.UnknownHostException: postgres
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_222]
docker-compose.yml
version: '3'
services:
# SpringBoot App
postgres:
image: "postgres:9.6-alpine"
ports:
- 5432:5432
volumes:
- apiDB:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
api:
build: ./annotation-tool
ports:
- 8080:8080
depends_on:
- postgres
client:
container_name: client-container
build: ./client
ports:
- 8081:8081
volumes:
apiDB:
API Dockerfile
FROM maven:3.6.1-jdk-8-slim AS build
RUN mkdir -p /workspace
WORKDIR /workspace
COPY pom.xml /workspace
COPY src /workspace/src
RUN mvn -f pom.xml clean package
FROM openjdk:8
COPY --from=build /workspace/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
我认为发生过/尝试过的事情
也许 DNS 不工作,但我不知道如何解决它
我尝试了不同的 docker-compose 和 Dockerfiles,但它不起作用
如果我运行 docker-compose,postgres 容器就会成功创建
我尝试将 url 主机更改为 postgres-backend,因为我的容器就是这样命名的
我尝试使用组件之间的链接。
【问题讨论】:
-
您的容器名为
postgres-backend,您可以尝试更改网址以包含它吗? -
它不起作用
spring.datasource.url=jdbc:postgresql://postgres-backend:5432/postgres,同样的错误 -
我建议删除所有
links:和container_name:选项;它们可能不会产生影响,但可能会使事情变得混乱,而且它们不是必需的。您在应用程序执行的哪个阶段尝试连接到数据库? (您是否在响应 HTTP 请求时收到此异常?您是否尝试在 Dockerfile 中运行迁移?) -
在 Dockerfile 中运行的东西无法连接到数据库或其他 Compose 管理的资源。 (它们不在 Compose 网络上,它们看不到环境变量或网络设置,并且无法保证构建顺序。)
-
构建不应依赖于数据库。 (“这是一个 jar 文件,但它并不是很有用,因为外部数据库只在我的机器上。”)我不确定您具体要构建什么,但在启动时进行与数据库相关的设置比在构建时间。
标签: postgresql spring-boot docker docker-compose