我有一个在Docker中运行的Sping Boot 应用程序,它可以成功运行。问题是,当我更新我的应用程序代码时,在重建镜像并启动容器之后,代码更改不会反映在Docker上。
这是我的Dockerfile。我尝试将src文件复制到镜像中,并在构建阶段打包spring Boot 应用程序。然后将生成的jar复制到另一个阶段,并在容器启动时运行应用程序。
FROM openjdk:17 as buildstage
WORKDIR /app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
RUN ./mvnw dependency:go-offline
COPY src src
RUN ./mvnw package -Dmaven.test.skip=true
COPY target/*.jar springboot-flash-cards-docker.jar
FROM openjdk:17
COPY --from=buildstage /app/springboot-flash-cards-docker.jar .
ENTRYPOINT ["java", "-jar", "springboot-flash-cards-docker.jar"]
这是我为spring Boot 应用程序编写的docker-compose.yml的一部分。
services:
container_name: springboot
build:
context: ./springboot-flash-cards
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- postgres
links:
- postgres
我已经检查了springboot容器中的代码在编辑我的代码库后没有更新。我检查的方式:
docker cp "springboot container":springboot-flash-cards-docker.jar .
java xf springboot-flash-cards-docker.jar
我尝试使用docker compose build --no-cache来防止docker build image从缓存中删除。但不管用。
预期行为:spring Boot 应用程序中的Dode更改将在重建镜像后反映出来,并在docker容器内运行。
1条答案
按热度按时间83qze16e1#
感谢@DavidMaze的帮助。问题已解决。
出现问题的原因:
**
docker run
命令在新容器中运行一个命令,如果需要,拉取镜像并启动容器。**来自Docker文档在原始Dockerfile中,
RUN ./mvnw package -Dmaven.test.skip=true
构建jar文件在容器内。COPY target/*.jar springboot-flash-cards-docker.jar
会将jar文件target/.jar从宿主机复制到容器中。我所期望的是移动并重命名在docker容器内构建的jar。由于代码更改后我没有在主机上打包代码,因此代码更改不会反映在docker上。如何修复它:
使用
RUN mv target/*.jar springboot-flash-cards-docker.jar
代替COPY target/*.jar springboot-flash-cards-docker.jar
。此命令会将容器内的target/.jar**移动并重命名为springboot-flash-cards-docker.jar。固定的docker文件: