gpt4 book ai didi

java - 通过 gradle 为 spring boot 应用构建 docker 镜像时的最佳实践

转载 作者:行者123 更新时间:2023-12-05 05:43:58 37 4
gpt4 key购买 nike

我计划使用 gradle 作为构建工具和 docker 来容器化 spring boot 应用程序。

我目前有一个关于最佳实践/优点/缺点的问题:
一种。从一般角度作为最佳实践。
b.从 CI/CD 的角度来看。

我明白我可以通过三种方式做到这一点:

1。通过在您的主机上运行命令进行 gradle 构建 + 然后将您的 spring boot 应用程序 dockerize

例如:

/.gradlew build

docker build -f dockerfile...

2。在 dockerfile 本身内部进行 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 的挂载选项,而不是一次又一次地重建图像以反射(reflect)本地更改。

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

3。使用 buildpacks、jib 或 spring boot 构建镜像命令。

有什么想法吗?如果有人在这方面遇到过任何利弊,请分享。

最佳答案

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

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

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

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

  1. 使用层避免重建未更改的代码。
  2. 使用 Gradle Docker 插件将 Docker 构建集成到 Gradle 中。不知道现在Spring Boot插件有没有集成Docker构建任务,有的话就用吧。
  3. 如果您的代码可以接受,请使用 JRE 而不是 JDK 作为基础。许多项目不需要 JDK 即可运行。

关于java - 通过 gradle 为 spring boot 应用构建 docker 镜像时的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71697307/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com