通过 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 应用程序。最值得注意的是:
- 使用图层避免重建代码未更改。
- 使用 Gradle Docker 插件在 Gradle 中集成 Docker 构建。我不确定 Spring Boot 插件现在是否集成了 Docker 构建任务,如果是,请使用它。
- 如果您的代码可以接受,请使用 JRE 而不是 JDK 作为基础。许多项目不需要 JDK 到 运行.
我计划将 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 应用程序。最值得注意的是:
- 使用图层避免重建代码未更改。
- 使用 Gradle Docker 插件在 Gradle 中集成 Docker 构建。我不确定 Spring Boot 插件现在是否集成了 Docker 构建任务,如果是,请使用它。
- 如果您的代码可以接受,请使用 JRE 而不是 JDK 作为基础。许多项目不需要 JDK 到 运行.