【问题标题】:Can't package my Spring Boot application with Jib无法使用 Jib 打包我的 Spring Boot 应用程序
【发布时间】:2021-07-31 20:38:12
【问题描述】:

我想使用带有 Gradle 的 Jib 将我的 Spring Boot 应用程序打包为 Docker 容器。

更多 除了关注Jib's readme,我还从一个简单的JHipster 项目中复制了一个示例。你猜怎么了?没用。

好的,这里是代码。

JHipster 生成器创建一个专用的 gradle/docker.gradle 文件,该文件从主 Gradle 构建文件应用,并正在导入 Jib 插件

所以我复制了JH jib文件开始

我的gradle/jib.gradle

jib {
    from {
//        image = "adoptopenjdk:8-jre"
        image = "adoptopenjdk:11-jre-hotspot"
    }
    to {
        image = "myapp:latest"
    }
    container {
        entrypoint = ["bash", "-c", "/entrypoint.sh"]
        ports = ["8080"]
        environment = [
            SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS",
            SPRBOOT_SLEEP: "0"
        ]
        creationTime = "USE_CURRENT_TIMESTAMP"
    }
    extraDirectories {
      paths = file("src/main/jib")
      permissions = ["/entrypoint.sh": "755"]
    }
}

注释部分是因为我想使用 JDK8,但我正在尝试 JHipster 所做的。

其次,我根据 JH 的存储库复制了我自己的 entrypoint.sh。这里是src/main/jib/entrypoint.sh

#!/bin/sh

echo "The application will start in ${SPRBOOT_SLEEP}s..." && sleep "${SPRBOOT_SLEEP}" # Author's note: it's pointless
exec java "${JAVA_OPTS}" -noverify \
  -XX:+AlwaysPreTouch \
  -Djava.security.egd=file:/dev/./urandom \
  -cp /app/resources/:/app/classes/:/app/libs/* \
  "com.acme.MyApplication" "$@"

当然,我必须将 jib 插件 3.0.0 添加到我的 Gradle 文件中,应用 jib.gradle 脚本

plugins {
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'war'
    id "com.google.cloud.tools.jib" version '3.0.0'
    id 'org.unbroken-dome.test-sets' version '3.0.1'
    id 'org.flywaydb.flyway' version '7.5.4' apply false
    id 'com.telenia.gradle.MybatisGenerator' version '2.1.5'
    id 'net.ltgt.apt-eclipse' version '0.21' apply false
}

apply from: 'gradle/jib.gradle'

说明时间

现在我希望gradle jibDockerBuild/app 下创建一个包含我的应用程序文件的容器,并使用入口点启动 Spring Boot 可执行文件。我不关心sleep,它是0,是JH继承的

当然,当我从 JHipster 项目构建 Docker 映像时,它就像一个魅力。当我构建自己的容器时,运行它失败并出现经典的 Unable to locate main class 错误

The application will start in 0s...

Error: Could not find or load main class

Caused by: java.lang.ClassNotFoundException:

我尝试将bash 放入容器中,但根本没有/app 目录。 JHipster 构建的容器下有一个/app 目录。

尝试检查这两个图像在写这篇文章时,我发现了一些不同之处。 JHipster 在/app 下部署文件,而我的Gradle 脚本在/var/lib/jetty/webapps/ROOT 下部署jar。我的应用程序始终启用 war 插件,而 JHipster 仅在设置了 -Pwar 变量时才启用插件。

我不关心在图像中使用战争或嵌入式服务器,只要结果是生产级的。我仍然需要能够构建一个战争文件。

问题

如何正确配置现有的基于 Gradle 的 Spring Boot 项目以使用 Jib 构建为 Docker 容器?鉴于我优先考虑基于 Spring Boot 的 JHipster 的现有代码,我的代码有什么问题?

编辑 1

:在 JHipster 项目中,gradle -Pwar jibDockerBuild 在容器内部署/jetty/webapps 下的文件,当我启动应用程序时,我得到了神奇的错误Could not find or load main class

【问题讨论】:

    标签: spring-boot gradle jib


    【解决方案1】:

    我的错误是没有完整阅读 Jib 文档。

    Jib 决定在战争项目上做什么

    Jib 还将 WAR 项目容器化。如果 Gradle 项目使用 WAR 插件,Jib 默认使用 jetty 作为基础镜像来部署项目 WAR。除了使用 WAR 插件让 Jib 构建 WAR 图像之外,不需要额外的配置。

    这可能是 JHipster 需要 -Pwar 启动属性来公开战争任务的原因,这样您就可以构建 Spring Boot jar 的容器化版本,或者生成的 war 文件的 web-server-ed 容器.

    为不阅读文档而感到羞耻

    【讨论】:

      【解决方案2】:
      推荐的答案 Google Cloud

      对于那些可能只想开始在 Spring Boot 中使用 Jib 但由于任何原因遇到问题的人:

      大多数时候,Jib 应该与 Spring Boot 一起开箱即用。这是演示的最小设置:

      1. 创建一个 Spring Boot 应用程序,例如,使用Spring Initializr。不管是 Maven 还是 Gradle 项目:
        $ curl https://start.spring.io/starter.tgz \
            -d type=gradle-project \
            -d dependencies=web \
            -d baseDir=demo | tar -xzvf -
        
      2. 打开 build.gradle 并应用 Jib 插件。
         plugins {
             id 'org.springframework.boot' version '2.4.5'
             id 'io.spring.dependency-management' version '1.0.11.RELEASE'
        +    id 'com.google.cloud.tools.jib' version '3.0.0'
             id 'java'
         }
        
      3. 使用 Jib 进行容器化。
        $ ./gradlew jibDockerBuild
        
      4. 运行映像。 (该应用程序可通过localhost:8080 访问。)
        $ docker run --rm -p8080:8080 demo:0.0.1-SNAPSHOT
        

      这是一个最小设置,但您肯定希望进一步自定义 Jib 配置。

      最后,尽可能选择<packaging>jar 而不是war

      【讨论】:

        猜你喜欢
        • 2017-04-20
        • 1970-01-01
        • 2019-06-08
        • 2020-01-19
        • 2017-02-10
        • 2016-01-22
        • 2019-08-10
        • 2018-12-24
        • 2017-03-02
        相关资源
        最近更新 更多