Не получается запустить контейнер, PSQLException: Connection to localhost:5432 refused

Рейтинг: 1Ответов: 1Опубликовано: 16.08.2023

Здравствуйте. Пытаюсь запустить docker compose up для примитивного приложения с БД на postgresql, получаю следующие ошибки:

    org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

    javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution 

**Пробовал service postgresql stop и kill -9, но получаю после этого** 

    Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5432 -> 0.0.0.0:0: listen tcp 0.0.0.0:5432: bind: address already in use

docker-compose

version: '3.3'

services:
  localhost:
    container_name: db_postgres
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: ****
      POSTGRES_PASSWORD: ****
      POSTGRES_DB: my_db
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: 'student-app'
    ports:
      - "8088:8090"

**Dockerfile**

    FROM openjdk:11
MAINTAINER DaniilK
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/my_db?useSSL=false
spring.datasource.username=****
spring.datasource.password=****
server.port=8088
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect

logging.level.org.springframework.web=DEBUG

spring.jpa.hibernate.ddl-auto=validate

spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml

#временное решение
spring.liquibase.enabled=false

Данная ошибка достаточно распространенная, но решение проблемы не могу найти. Сама БД в докере запускается, данные ошибки выдает часть app

Само приложение работает без ошибок, проверял на Postman перед упаковкой в контейнер Пожалуйста дайте комментарии, заранее спасибо!

Ответы

▲ 2Принят

Называть сервис localhost очень плохая идея. Т.к. это зарезервированное DNS имя, которое резолвится в 127.0.0.1. И скорее всего оно имеет больший приоритет над localhost как имя сервиса.

Попробуйте переименовать сервис в что-то другое, например, db и обновить адрес подключение в app: jdbc:postgresql://db:5432/my_db?useSSL=false. Ну или использовать имя контейнера db_postgres.

Также в app можно добавить

depends_on:
    - db

чтобы app контейнер "зависел" от базы, это повлияет на порядок запуска контейнеров, первым будет запускаться база, а потом - приложение. Это частично поможет решить проблемы когда у вас приложение запускается раньше базы.