使用Gradle、Sping Boot 和PostgreSQL编写Docker-compose:如何正确处理构建和启动顺序?

vcirk6k6  于 2023-10-19  发布在  PostgreSQL
关注(0)|答案(1)|浏览(71)

我正在做一个Sping Boot pet项目,使用PostgreSQL作为数据库,并使用Docker Compose来编排容器。我面临的问题是,我的Dockerfile中的RUN ./gradlew build命令在PostgreSQL容器完全启动和运行之前就被执行了,导致我的测试在构建过程中失败。
Dockerfile:

# Build stage
FROM amazoncorretto:17 AS build
WORKDIR /app
COPY ../ /app
RUN ./gradlew build

# Runtime stage
FROM amazoncorretto:17 AS runtime
WORKDIR /app
COPY --from=build /app/build/libs/*.jar /app/app.jar
CMD ["java", "-jar", "/app/app.jar"]

docker-compose.yaml:

version: '3.8'

services:
  postgres:
    image: 'postgres:latest'
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - '5432:5432'
    healthcheck:
      test: pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}
      interval: 10s
      timeout: 5s
      retries: 5

  app:
    build:
      context: .
      dockerfile: docker/Dockerfile
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB}
      SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER}
      SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - '8080:8080'

我尝试在docker-compose.yaml中使用depends_onhealthcheck,但问题仍然存在。
我的问题是
1.在运行./gradlew build命令之前,确保PostgreSQL容器完全就绪的最佳方法是什么?
1.在构建过程中,是否有一种更“Docker-native”或“Spring-native”的方式来处理这种依赖关系?

ehxuflar

ehxuflar1#

从Sping Boot 3.1开始,支持Docker Compose。Sping Boot 将为您启动容器,并将任何必要的凭据或连接详细信息注入Spring Environment,从而允许其他库(如Spring Data)创建其bean。
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.docker-compose
Sping Boot 的Docker Compose支持也可以用于测试。

相关问题