通过 gradle 为 spring 引导应用程序构建 docker 映像时的最佳实践

Best practices while building docker images for spring boot app via gradle

我计划将 gradle 作为构建工具与 docker 一起用于容器化 spring 启动应用程序。

我目前有一个关于最佳 practices/pros/cons 来自:
的问题 一种。从一般角度来看是最佳实践。
b.从 CI /CD 的角度来看。

我已经明白我可以通过三种方式做到:

1。在您的主机上通过 运行 命令进行 gradle 构建 + 然后 docker 化您的 spring 启动应用程序

例如:

/.gradlew build

docker build -f dockerfile...

2。在 docker 文件本身中 gradle 构建。

对于 2,我从 dockercon(https://www.docker.com/blog/intro-guide-to-dockerfile-best-practices/) 的这些人那里得到灵感。

例如:

FROM gradle:4.7.0-jdk8-alpine AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon 

FROM openjdk:8-jre-slim

EXPOSE 8080

RUN mkdir /app

COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar

ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-Djava.security.egd=file:/dev/./urandom","-jar","/app/spring-boot-application.jar"]

还有其他文章

https://codefresh.io/docs/docs/learn-by-example/java/gradle/

https://codefresh.io/docker-tutorial/java_docker_pipeline/

这里我还想针对选项 2 指出: 一种。我计划使用 docker 中的挂载选项,而不是一次又一次地重建映像以反映本地更改。

b。我计划利用多阶段构建,这样我们就可以丢弃繁重的 gradle 输入,只关注最终输出中的 jar。

3。使用 buildpacks、jib 或 spring 引导构建映像命令。

有什么想法吗?如果有人在这方面有过任何优缺点,请分享。

从 Gradle 构建 Docker 图像近 7 年后,早在 Docker 成为司空见惯的事情之前,我从未做过选项 2。我做过选项 1和 3,主要是 3.

#1 的问题是您丢失了 Gradle 项目中可用于构建映像的信息,例如 jar 文件的位置和项目名称(还有其他几个) .您最终在命令行上重新定义它们,结果可能会大不相同。

#2 的问题是开发人员生产力的损失和职责的混淆。我无法想象每次更改代码时都构建一个 Docker 图像。 Gradle 是构建工具,Docker 是交付机制,它们的目标不同。

您可以在网上找到许多关于构建 Docker 图像的文章,它们同样适用于 Spring 应用程序。最值得注意的是:

  1. 使用图层避免重建代码未更改。
  2. 使用 Gradle Docker 插件在 Gradle 中集成 Docker 构建。我不确定 Spring Boot 插件现在是否集成了 Docker 构建任务,如果是,请使用它。
  3. 如果您的代码可以接受,请使用 JRE 而不是 JDK 作为基础。许多项目不需要 JDK 到 运行.