我正在做一个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_on
和healthcheck
,但问题仍然存在。
我的问题是
1.在运行./gradlew build
命令之前,确保PostgreSQL容器完全就绪的最佳方法是什么?
1.在构建过程中,是否有一种更“Docker-native”或“Spring-native”的方式来处理这种依赖关系?
1条答案
按热度按时间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支持也可以用于测试。