Docker Compose + Spring Boot + Postgres 连接,导致报错
Posted
技术标签:
【中文标题】Docker Compose + Spring Boot + Postgres 连接,导致报错【英文标题】:Docker Compose + Spring Boot + Postgres connection, resulting in error 【发布时间】:2019-04-19 06:49:12 【问题描述】:我有一个与 Postgres 数据库配合使用的 Java Spring Boot 应用程序。我想对它们都使用 Docker。最初,我创建了一个docker-compose.yml
文件,如下所示:
version: '3'
services:
db:
container_name: sample_db
image: postgres
volumes:
- sample_db:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
- POSTGRES_DB="employee"
- POSTGRES_USER="user"
- POSTGRES_PASSWORD="password"
- PGDATA=/var/lib/postgresql/data/pgdata
web:
build: .
expose:
- "8080"
depends_on:
- db
volumes:
sample_db:
然后,在我的 Spring Boot 应用程序的 application.properties 文件中,我定义了以下属性。
spring.datasource.url=jdbc:postgresql://db:5432/employee
spring.datasource.username=user
spring.datasource.password=password
与此同时,我在我的项目目录中创建了一个 Dockerfile,如下所示:
FROM openjdk:8-jdk-alpine
EXPOSE 8080
ARG JAR_FILE=target/employee-0.0.1-SNAPSHOT.jar
COPY $JAR_FILE employee-demo.jar
ENTRYPOINT ["java","-jar","employee-demo.jar"]
我发出了这些命令,结果出现如下错误
mvn 清洁包
码头工人组成
问题在于连接字符串。我相信我必须将其更改为其他内容,但我不知道应该是什么。我收到以下错误消息:
Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
web_1 | at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:292) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at org.postgresql.Driver.makeConnection(Driver.java:454) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at org.postgresql.Driver.connect(Driver.java:256) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.2.0.jar!/:na]
web_1 | at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1 | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1 | at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1 | ... 44 common frames omitted
web_1 | Caused by: java.net.UnknownHostException: sample_db
web_1 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_181]
web_1 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
web_1 | at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
web_1 | at org.postgresql.core.PGStream.<init>(PGStream.java:70) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:91) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | ... 58 common frames omitted
我是docker新手,如有问题请告知
【问题讨论】:
试试***.com/questions/52011016/… 【参考方案1】:您的服务名称是 db
,您需要将其作为 Web 容器中的主机名进行引用。容器名称sample_db
无法从 Web 容器中解析,因为您尚未指定网络,因此使用的是默认桥接网络。
根据文档,默认桥接网络不提供容器之间的名称解析,仅提供 IP。使用 docker compose,应该可以使用服务名来解析。
https://docs.docker.com/network/bridge/
https://docs.docker.com/compose/networking/
version: '3'
services:
db:
container_name: sample_db
image: postgres
volumes:
- sample_db:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
- POSTGRES_DB="employee"
- POSTGRES_USER="user"
- POSTGRES_PASSWORD="password"
- PGDATA=/var/lib/postgresql/data/pgdata
networks:
- my_network
web:
build: .
expose:
- "8080"
depends_on:
- db
networks:
- my_network
volumes:
sample_db:
networks:
my_network:
driver: bridge
链接也应该起作用,而不是定义您自己的自定义桥接网络:
web:
build: .
expose:
- "8080"
depends_on:
- db
links:
- "db:sample_db"
【讨论】:
那么我该如何纠正这个问题?我认为以正确的方式使用它jdbc:postgresql://db:5432/employee
根据堆栈跟踪UnknownHostException: sample_db
,有些东西正在尝试使用容器名称。您可以尝试在撰写文件中创建自己的桥接网络并让您的容器加入它(请参阅链接和示例的答案)。
感谢您的宝贵时间。我得到了我的问题。我会在这里发布。【参考方案2】:
这是因为错误地给出了" "
。我把它改成
version: '3'
services:
db:
restart: always
image: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_DB=employee
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
web:
build: .
ports:
- 8080:8080
现在它工作正常。感谢您宝贵的时间。
【讨论】:
以上是关于Docker Compose + Spring Boot + Postgres 连接,导致报错的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + docker-compose + MySQL:连接被拒绝
Spring-boot - Docker Compose - 服务就绪
使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint
Spring Boot 2.0:Docker Compose + Spring Boot +