我正在尝试使用docker为sprint启动应用程序设置我的开发环境。
我在用智能点子。
dockerfile.
FROM gradle:7.4.2-jdk18-alpine AS build
COPY --chown=gradle:gradle ./ /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon --debug
FROM openjdk:19-slim
EXPOSE 5097
EXPOSE 5005
RUN mkdir /app
COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar
ENTRYPOINT ["java", "-Xdebug", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "/app/spring-boot-application.jar"]
和docker-compose。yml:
version: '3.7'
services:
hmis-config-service:
build:
context: .
dockerfile: Dockerfile
image: 'hmis-config-service:0.0.0.1'
ports:
- "9060:5080"
- "8091:5005"
volumes:
- myapp:/home/gradle/src
environment:
db.url: 'jdbc:postgresql://host.docker.internal:5432/hms'
db.username: 'postgres'
db.password: 'pgsroot'
GRADLE_HOME: /usr/local/gradle
JAVA_HOME: /usr/lib/jvm/java
M2: /usr/local/apache-maven/bin
M2_HOME: /usr/local/apache-maven
volumes:
myapp:
每次我试图构建它,它需要很长时间,因为它下载所有gradle依赖。因此,即使是很小的变化也需要很长时间。
如果项目开始使用
docker-compose up # without the --build flag
它立即启动,但所做的更改不在容器中。
我试图挂载卷/home/gradle/src以保持依赖项同步,但没有做任何事情。
可以做些什么来改善构建时间和缓存依赖关系?
你需要在docker上下文中构建应用程序吗?如果您在外部(本地)构建它,并且只复制工件,那么您可以利用(本地)gradle
守护进程的构建缓存,这应该会显著提高速度。
本质上,您是在每次构建/调用时从头构建项目。
。e,不要在Dockerfile
内部构建,只复制已经构建的工件。
PS:如果您必须在docker上下文中构建(例如,如果您在本地没有JDK),您可以尝试找出gradle
保持其本地缓存的位置并同步/复制它。
正如您所提到的,问题是构建需要很长时间,因为它每次都下载依赖项。
如果是这种情况,您可以尝试使用多阶段构建。
基本上你下载一次依赖项,然后每次都复制它们。这也减少了图像的大小。
引用:
- https://docs.docker.com/develop/develop-images/multistage-build/
- https://spring.io/guides/topicals/spring-boot-docker/
- https://gist.github.com/msauza/6a906e879549e218c54868d81161afcb
- https://hashedin.com/blog/a-guide-to-optimize-build-time-in-docker/
p。S:我还没有在Spring Boot应用程序上尝试过,但是它们在基于Go的应用程序上运行得很好。