Java Docker Compose+;弹簧靴&x2B;Postgres连接,导致错误
我有一个JavaSpring启动应用程序,它可以与Postgres数据库一起工作。我想用Docker来处理这两个问题。最初,我创建了一个Java Docker Compose+;弹簧靴&x2B;Postgres连接,导致错误,java,spring,postgresql,spring-boot,docker,Java,Spring,Postgresql,Spring Boot,Docker,我有一个JavaSpring启动应用程序,它可以与Postgres数据库一起工作。我想用Docker来处理这两个问题。最初,我创建了一个docker compose.yml文件,如下所示: version: '3' services: db: container_name: sample_db image: postgres volumes: - sample_db:/var/lib/postgresql/data ports: - &
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"]
我发出了这些命令,结果出现了如下所示的错误
清洁包装
码头工人整理
问题在于连接字符串。我相信我必须把它换成别的东西,但我不知道它应该是什么。我收到以下错误消息:
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
原因:org.postgresql.util.PSQLException:连接尝试失败。
web_1 |位于org.postgresql.core.v3.connectionfactorympl.openConnectionImpl(connectionfactorympl.java:292)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 |位于org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 |在org.postgresql.jdbc.PgConnection.(PgConnection.java:195)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | org.postgresql.Driver.makeConnection(Driver.java:454)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 | org.postgresql.Driver.connect(Driver.java:256)~[postgresql-42.2.5.jar!/:42.2.5]
web_1|位于com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136)~[HikariCP-3.2.0.jar!/:na]
web_1 |位于com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369)~[HikariCP-3.2.0.jar!/:na]
web_1 |位于com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)~[HikariCP-3.2.0.jar!/:na]
web_1 |在com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)~[HikariCP-3.2.0.jar!/:na]
在com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)~[HikariCP-3.2.0.jar!/:na]
在com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115)~[HikariCP-3.2.0.jar!/:na]上浏览
web_1 |在com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)~[HikariCP-3.2.0.jar!/:na]
web|1 |位于org.hibernate.engine.jdbc.connections.internal.datasourceconnectionprovidedempl.getConnection(datasourceconnectionprovidedempl.java:122)~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web|1 |位于org.hibernate.engine.jdbc.env.internal.jdbc环境启动器$connectionProviderjdbc连接access.获得连接(jdbc环境启动器.java:180)~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web|1 |位于org.hibernate.resource.transaction.backend.jdbc.internal.ddltransactionolatornonjtaimpl.getIsolatedConnection(ddltransactionolatornonjtaimpl.java:43)~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1 |。。。省略了44个公共帧
web_1|由以下原因引起:java.net.UnknownHostException:sample_db
web|位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)~[na:1.8.0|181]
web_1|位于java.net.socksocketimpl.connect(socksocketimpl.java:392)~[na:1.8.0_181]
web|在java.net.Socket.connect(Socket.java:589)~[na:1.8.0|181]
网址:org.postgresql.core.PGStream.(PGStream.java:70)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 |位于org.postgresql.core.v3.connectionfactorympl.tryConnect(connectionfactorympl.java:91)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 |位于org.postgresql.core.v3.connectionfactorympl.openConnectionImpl(connectionfactorympl.java:192)~[postgresql-42.2.5.jar!/:42.2.5]
web_1 |。。。省略58个公共帧
我是docker的新手,如果有任何问题,请通知您的服务名称是
db
,这是您需要从web容器中引用的主机名。容器名称“sample_db”无法从web容器解析,因为您尚未指定网络,因此正在使用默认网桥网络
根据文档,默认的网桥网络不提供容器之间的名称解析,只提供IP。使用docker compose,您应该能够使用服务名称进行解析
链接也应该起作用,而不是定义自己的自定义网桥网络:
web:
build: .
expose:
- "8080"
depends_on:
- db
links:
- "db:sample_db"
这是因为错误地给出了
”
。我把它改成了
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
现在它运行良好。谢谢您宝贵的时间。试试看,我该如何更正?我认为我使用它的方式是正确的
jdbc:postgresql://db:5432/employee
根据堆栈跟踪UnknownHostException:sample\u db
,有人试图使用容器名称。您可以尝试在compose文件中创建自己的网桥网络,并让您的容器加入其中(请参阅链接和示例的答案)。谢谢您的时间。我有我的问题。我会把它贴在这里。
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