如何使用 Dockerfile 将 Maven 依赖项存储在 docker 映像内

Gri*_*ger 4 java docker spring-boot docker-compose

所以我正在制作一个 Spring Boot 应用程序,我应该将其放入 docker 容器中并运行,并且我想使用 docker 文件构建整个映像。
我正在使用这个 dockerFile:

FROM openjdk:8-jdk-alpine
ADD . /analytics-service
WORKDIR /analytics-service
ENTRYPOINT ./mvnw spring-boot:run 
Run Code Online (Sandbox Code Playgroud)

当我创建图像时,它只是复制文件,并且只有在我运行它之后,它才开始下载所有 Maven 依赖项。鉴于我将运行一些容器,这需要一段时间。那么我该怎么做呢?我希望它在创建图像时获取所有依赖项,因此当我创建容器时它不会开始下载。

And*_*rew 7

如果我理解正确的话,您想先下载 Maven 依赖项,然后将它们与您的应用程序合并成一个映像吗?

如果这就是您想要的,那么正确的方法如下:

  1. 拉取一个 Maven 映像(通常您将此阶段称为“构建器” - 这只是一个名称)
  2. 将 pom.xml 文件复制到工作目录中
  3. 运行maven一次以获取依赖项,然后再次将其打包
  4. 从 openjdk 创建新的镜像库
  5. 将步骤 3 的结果复制到您的应用程序映像中
  6. 暴露一个端口
  7. 提供一个切入点

Dockerfile 中的内容如下:

FROM maven AS builder
WORKDIR /usr/src/analytics
COPY pom.xml .
RUN mvn -B dependency:go-offline

COPY . .
RUN mvn package

FROM openjdk:8-jdk-alpine
WORKDIR /analytics-service
COPY --from=builder /usr/src/analytics/target/YOUR_JAR_FILENAME.jar .
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/analytics-service/YOUR_JAR_FILENAME.jar"]
Run Code Online (Sandbox Code Playgroud)

在运行此命令之前,您需要知道您的 jar 文件是如何命名的。您可以在计算机上的 Docker 外部运行 mvn package 并查看生成的文件名。将其复制到 Dockerfile 中上面的两个位置。