Docker撰写-应用程序容器无法连接到postgresSQL容器

3htmauhk  于 2022-12-11  发布在  Docker
关注(0)|答案(1)|浏览(238)

我正在尝试对接与PostgresSQL DB连接的Sping Boot 应用程序。当我尝试使用Docker合成调出应用程序时,应用程序容器无法连接到PostgresSQL运行容器。我搜索了它,并尝试了大多数可能的修复(针对Docker合成文件中使用的DB依赖性),但仍然无法使其连接。
我可以从日志中看到-
错误原因:连接到postgresqldb:5432被拒绝。请检查主机名和端口是否正确,以及邮局管理员是否接受TCP/IP连接。springboot-postgresql|异常错误:连接被拒绝|在java.base/sun.nio.ch.Net.pollConnect(本地方法)上~[na:na]
我在本地的www.example.com文件里找到application.properties了-

spring.datasource.url= jdbc:postgresql://localhost:5432/ecommerce
spring.datasource.username= postgres
spring.datasource.password= root
spring.datasource.driver-class-name= org.postgresql.Driver

spring.sql.init.mode=always
#spring.batch.initialize-schema=always
logging.level.org.hibernate.SQL= DEBUG

spring.jpa.defer-datasource-initialization=true
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto= create
spring.jpa.hibernate.database= postgresql
enter code here

对接-合成-

version: '3.1'
services:
  app:
    container_name: springboot-postgresql
    command: >
      sh -c "/wait && java -jar /spring-boot-ecommerce.jar"
    image: springboot-postgresql
    extra_hosts:
      - 'postgresqldb:127.0.0.1'
    environment:
      - RP_DB_HOST=postgres
      - dbhost=localhost
      - SPRING_DATASOURCE_URL=jdbc:postgresql://postgresqldb:5432/ecommerce?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false
    build: ./
    ports:
      - '9090:8080'
    depends_on:
      - postgresqldb
  postgresqldb:
    container_name: postgresqldb
    image: 'postgres:13.1-alpine'
    ports:
      - '5432:5432'
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_USER=postgres
      - POSTGRES_DB=ecommerce
    volumes:
      - './sql/data.sql:/docker-entrypoint-initdb.d/data.sql'
    expose:
      - 5432
    restart: always

数据库容器已启动,具有相同的名称和端口,如下所示,但应用程序容器无法连接。一种可能性是应用程序容器比数据库启动早,我添加了相同的等待命令,但它没有创建差异。x1c 0d1x
[更新] -现在应用程序容器已启动并运行,我可以看到它已按预期更新了数据库。我无法使用http://localhost:9090/api/访问API。还尝试将localhost替换为容器inet addr。是否有任何指针?

zlwx9yxi

zlwx9yxi1#

TL;DR

去掉这个:

extra_hosts:
  - 'postgresqldb:127.0.0.1'

我看到您尝试将所有可能的修复应用到您的配置。让我们一步一步地详细说明。

  1. EXPOSE指令实际上并不发布端口。它只是对devs的一个提示。所以,你可以从你的compose中删除它,让配置更干净。
  2. container_name: postgresqldb不用于解析Docker网络中的DNS名称。在您的情况下,由合成文件中的服务ID提供的域名(如postgresqldb):阅读更多信息
services:
   app:          # so that, you get the "app" domain name
   postgresqldb: # so that, you get the "postgresqldb" domain name
  1. ports: '5432:5432'不是从java应用程序访问数据库所必需的。这是使用iptables记录将主机tcp入口路由到容器所必需的。在您的情况下,此指令允许您在docker之外的主机上直接使用localhost:5432。例如,您可以在一些应该管理数据库的GUI中使用此地址。
  2. extra_hosts指令将额外的DNS记录添加到一个容器中。在您的情况下,这是一个断点,因为它用错误的地址127.0.0.1覆盖了postgresqldb域。正如我在开始时提到的,只需删除此指令。如果您想知道postgresqldb接收哪个IP,欢迎您检查Docker网络。阅读更多

相关问题