java - Docker多阶段构建-为什么要在Docker中构建?

标签 java docker maven

Docker / java新手在这里。
this doc中,我看到:

Use multistage builds. For instance, you can use the maven image to build your Java application, then reset to the tomcat image and copy the Java artifacts...



我知道我们使用容器化来确保应用程序的运行时环境完全符合需要,但是为什么我们也需要在容器中运行构建?拥有一个CI / CD管道不够吗?
  • 在/何时/何地需要时清理构建缓存
  • 再次运行构建
  • 使用新 Artifact 创建docker镜像吗?
  • 最佳答案

    如果您的构建 Artifact 是可移植的,并且您不认为主机构建环境很繁琐,那么按照您的描述进行操作绝对没有错。如果围绕SO的Java Docker问题来看,几乎所有的问题都有类似Dockerfiles

    FROM openjdk:8-jre
    COPY myapp.jar /
    CMD ["java", "-jar", "/myapp.jar"]
    

    实际上,在两种情况下,我会说您应该选择多阶段构建而不是其他选择:
  • 您正在使用一种会生成不可移植二进制文件(C++,Go,Rust)的编译语言,并且无法在本机Linux主机上工作。如果您在Docker内部构建应用程序,它将与最终的Docker运行时使用相同的操作系统。
  • 您的应用程序需要通常用C编写的扩展,这些扩展需要完整的工具链来构建,但不能运行。例如Python MySQL接口(interface)。

  • 如果您的构建系统相当标准化并且产生了可移植的 Artifact ,那么在主机上构建应用程序并将其复制到镜像中就可以了。 Java jar文件非常适合此模式。通过Webpack构建的Javascript浏览器应用程序也是如此。

    关于java - Docker多阶段构建-为什么要在Docker中构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61000461/

    相关文章:

    java - 在 Java 中设计规则引擎的有效设计模式/风格是什么?

    不同类中的 Java ActionEvent

    java - Spring 4如何定时刷新ConcurrentMapCache?

    docker - 我可以将参数传递给docker-compose命令配置选项吗

    docker - 为什么TeamCity无法通过jetbrains/agent镜像识别docker服务器属性?

    java - 使用 Maven Resolver Provider 以编程方式获取有效的 POM

    java - 我如何使用maven作为构建工具将测试报告复制到不同的目录

    java - 无法部署我的 Web 应用程序(Spring MVC、Tomcat 服务器、Maven、IntelliJ)

    java - 按 Id 查询 Morphia

    docker - 从 docker-compose 构建和使用 docker 镜像