Как исправить ошибку ERROR Connection to localhost:5432 refused?

При попытке запустить docker-compose с 2 контейнерами контейнер java почему-то стучит на localhost:5432, хотя я указал другую переменную окружения:

Dockerfile:


FROM openjdk:22
ARG APP_JAR=target/*.jar
ADD ${APP_JAR} course.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "course.jar"]

docker-compose.yml:

version: "3.9"
services:
  course_pg_17:
    image: postgres
    restart: always
    container_name: course_pg_17
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB:

  app:
    build:
      dockerfile: Dockerfile
    container_name: app
    expose:
      - "8080"
    ports:
      - "8081:8080"
    environment:
      DB_USER: postgres
      DB_PASSWORD: postgres
      DB_URL: jdbc:postgresql://course_pg_17:5432/postgres
    depends_on:
      - course_pg_17

application.properties:

spring.application.name=course
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.url=${DB_URL}

spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

server.port=8080

При попытке запуска контейнер с postgresql поднимается, а spring падает с ошибкой

2024-10-22T18:47:25.453265300Z 2024-10-22T18:47:25.453Z ERROR 1 --- [course] [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

По совету в комментариях я добавил переменные в Dockerfile таким образом, но это не решило проблему:

ENV DB_USER=postgres 
ENV DB_PASSWORD=postgres 
ENV DB_URL=jdbc:postgresql://course_pg_17:5432/postgres

Ответы (2 шт):

Автор решения: talex

Нужно задекларировать переменные среды в Docker файле добавив

ENV DB_USER
ENV DB_PASSWORD
ENV DB_URL

Полный пример

Dockerfile

FROM alpine:3.14
ENV MY_VAR="world"
CMD echo "Hello $MY_VAR"

docker-compose.yml

version: "3.9"
services:
  helloworld:
    build: .
    container_name: helloworld
    environment:
      MY_VAR: my world
→ Ссылка
Автор решения: Jarvis

Проблема была в загрузке FROM openjdk:22, поменял на FROM maven:3.8.7-eclipse-temurin-17 AS builder, в итоге Dockerfile стал выглядеть так и все заработало:

FROM maven:3.8.7-eclipse-temurin-17 AS builder

WORKDIR /app

COPY pom.xml ./

RUN mvn dependency:go-offline -B

COPY src ./src

RUN mvn package -DskipTests

FROM eclipse-temurin:17

WORKDIR /app

COPY --from=builder /app/target/*.jar ./app.jar

ENTRYPOINT ["java", "-jar", "./app.jar"]

EXPOSE 8080
→ Ссылка