java 使用Docker和docker-compose运行两次

zujrkrfu  于 2023-08-01  发布在  Java
关注(0)|答案(1)|浏览(146)

我有一个Sping Boot 应用程序,我试图在开发期间设置重新加载。我使用Docker compose with volume mount将主机目录Map到应用程序容器中。
当我启用重新加载以便自动反映代码更改时,它会导致应用程序运行两次。
这是预期的行为吗?我是不是配置不正确,导致它在热重装期间像这样加倍?
Dockerfile

FROM maven:3.8.4-openjdk-17-slim AS build

WORKDIR /app

COPY pom.xml .

RUN mvn dependency:go-offline -B

COPY src ./src

RUN mvn package -DskipTests

FROM openjdk:17-jdk-slim AS runtime

COPY --from=build /app/target/book-course-1.0.0.jar .

CMD ["java", "-jar", "book-course-1.0.0.jar"]

WORKDIR /app

字符串
docker-compose.yml

version: "3.7"
  services:
    app:
    build: .
    env_file: ./.env
    ports:
       - $SPRING_PORT:$SPRING_PORT
    depends_on:
       - mysqldb
    volumes:
       - .:/app
    restart: on-failure
    command: sh -c "./mvnw spring-boot:run"
    mysqldb:
    image: mysql:8.0.22

djmepvbi

djmepvbi1#

我不太确定,但dockerfile是一个构建阶段文件。这意味着,它只会在构建图像时使用。一旦你有了一个构建的映像,任何改变都不能影响已经构建的映像。
我想你正在寻找devtools设置,但同样,如果你使用CMD运行一个已经存在的JAR,Devtools不会有任何影响,因为图像是建立的。而CMD已经在运行旧JAR。
我认为(不是100%确定)您需要使用Gradle/Maven命令运行应用程序,例如,一旦文件更改,就会触发devtools。
您的卷应该看起来像这样:

volumes:
      - .:/app
      - /app/target

字符串
将devtools添加到您的maven/gradle配置中,默认情况下,DevTools不会检测到类路径之外的文件的更改,其中包括我们作为卷装载的/app目录中的文件。要解决此问题,您可以将以下配置添加到application.properties文件:

spring.devtools.restart.additional-paths=/app

相关问题