使用Docker Compose连接Spring Boot和Postgres时出现错误。

4

我有一个使用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 clean package

docker-compose up

问题在于连接字符串。我认为我需要将其更改为其他内容,但我不知道应该是什么。我收到以下错误消息:
 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,如果有任何问题,请告知。


尝试使用https://dev59.com/xa3la4cB1Zd3GeqPT-fU连接Docker Compose中的Tomcat和MySQL。 - Scary Wombat
2个回答

2
您的服务名称是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 - Anu
根据堆栈跟踪 UnknownHostException: sample_db,某些东西正在尝试使用容器名称。您可以尝试在组合文件中创建自己的桥接网络,并让您的容器加入它(请参见答案链接和示例)。 - Mike
谢谢您的时间。我有一个问题,我会在这里贴出来。 - Anu

0

这是因为错误地给出了" "。我将其更改为

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

现在它运行良好。感谢您宝贵的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接