DOKL57
DOKL57

Reputation: 45

spring flyway docker connection to localhost:5432 refused

I have a spring application with flyway and psql. After

mvn clean install
sudo docker build -t air-travels-api.jar .
docker run -p 8080:8080 air-travels-api.jar

I stuck with an error:

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.

2022-07-09 14:28:09.610  WARN 1 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

Here's my docker-compose.yaml:

version: '3'
services:
  air-travels-api:
    image: air-travels-api
    build:
      context: .
    container_name: air-travels-api
    ports:
      - "8080:8080"
    depends_on:
      - flyway
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://air-travels-api-db:5432/air-travels-api
      - SPRING_DATASOURCE_USERNAME=postgres
      - SPRING_DATASOURCE_PASSWORD=postgres
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
  flyway:
    image: boxfuse/flyway:5-alpine
    command: -url=jdbc:postgresql://air-travels-api-db:5432/air-travels-api -schemas=public -user=postgres -password=postgres migrate
    volumes:
      - ./migration:/flyway/sql
    depends_on:
      - air-travels-api-db
    environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=postgres
        - POSTGRES_DB=air-travels-api
        - POSTGRES_HOST=postgres
        - POSTGRES_PORT=5432
        - POSTGRES_SCHEMA=public
  air-travels-api-db:
    image: postgres:12
    restart: always
    ports:
      - "5432:5432"
    container_name: air-travels-api-db
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: air-travels-api

Dockerfile:

FROM adoptopenjdk:11-jre-hotspot
EXPOSE 8080
ADD target/air-travels-api-0.0.1-SNAPSHOT.jar air-travels-api.jar
ENTRYPOINT ["java", "-jar", "/air-travels-api.jar"]

Applicaton.yaml

spring:
  datasource:
    url: jdbc:postgresql://air-travels-api-db:5432/air-travels-api
    username: postgres
    password: postgres

I found a similar question on stackoverflow, they suggested making sure postgres is running on the local machine. But I have it running inside a container (air-travels-api-db).

Upvotes: 2

Views: 2677

Answers (1)

zer0
zer0

Reputation: 2909

There are 2 issues that I see:

  1. In the Application.yaml your url should be
jdbc:postgresql://air-travels-api-db:5432/air-travels-api

since your database service has the hostname air-travels-api-db and not localhost.

  1. In your flyway service in docker-compose.yaml, the url is also incorrect. It should point to air-travels-api-db instead of postgres.
    command: -url=jdbc:postgresql://api-travels-api-db:5432/air-travels-api -schemas=public -user=postgres -password=postgres migrate

You do set the environment variable, but it is possible the command-line argument will override that.

One suggestion: Database containers are known to have a slow startup, therefore, it is a good idea to either add a health-check to your database service, or make sure to implement retry logic in your application. Otherwise, you will see race condition issues where the application runs before the database is available and it crashes. This is very common.

Upvotes: 1

Related Questions