由Google JIB创建的Docker Image不包含Spring Rest文档的asciidoc

问题描述

我使用Spring Rest Docs和jib

当我执行./gradlew buildjava -jar /some/build/libs/app.jar时。我可以在example.com/docs/asciidocname.html上获得Spring Rest文档生成api文档

但是带有./gradlew jib的docker镜像不包含该URL。

我要获取./gradlew jib时由Spring Rest Docs生成api文档

以下是我的build.gradle

的一部分
plugins {
    id "org.asciidoctor.convert" version "2.4.0"
    id "com.google.cloud.tools.jib" version "2.5.0"
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
    asciidoctor
}

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
    maven { url 'https://repo.spring.io/snapshot' }
}

sourceCompatibility = '11'

dependencies {
    /**
     * RestDocs
     */
    asciidoctor 'org.springframework.restdocs:spring-restdocs-asciidoctor'
    testImplementation('org.springframework.restdocs:spring-restdocs-mockmvc')
}

test {
    useJUnitPlatform {
        includeEngines 'junit-jupiter'
    }
}

/*************************
 * Rest Docs
 *************************/
asciidoctor {
    dependsOn test
}

bootJar {
    dependsOn asciidoctor
    from ("${asciidoctor.outputDir}/html5") {
        into 'static/docs'
    }
}

解决方法

您已将bootJar任务配置为依赖于asciidoctor任务并包括生成的HTML文件:

bootJar {
    dependsOn asciidoctor
    from ("${asciidoctor.outputDir}/html5") {
        into 'static/docs'
    }
}

Jib在构建容器映像时不使用jar文件,因此您需要向Jib添加类似的配置。

让我们首先让它包含生成的HTML。它提供了一个名为jib的扩展名,您可以在其中使用extraDirectories进行扩展:

jib {
    extraDirectories {
        paths {
            path {
                from = "${asciidoctor.outputDir}/html5"
                into = "/app/resources/static/docs"
            }
        }
    }
}

您可以了解更多有关在the documentation for its Gradle plugin中将文件添加到Jib生成的图像中的信息。

现在,我们需要将jib任务配置为依赖于asciidoctor任务。这样可确保在Jib尝试将HTML包含在图像中之前已生成HTML。由于扩展名和任务都命名为jib,因此我们需要显式引用任务:

tasks.named('jib') {
    dependsOn asciidoctor
}

如果您曾经将映像构建到本地Docker守护程序,则可能还需要对jibDockerBuild任务进行类似的配置:

jibDockerBuild {
    dependsOn asciidoctor
}
,

然后我找到了另一种方式。

第一。 JIB通过java -cp命令执行一个主要的Java类。未打包的.jar文件。

和asciidoctor任务将html文件复制到jar文件中。

我可以在臂架gradle github上找到选项。

  1. 如果您使用containerizingMode = 'packaged'选项。它将构建jar文件并在Docker容器中执行java -cp命令。
  2. 和具有此选项的./gradlew jib任务将执行jar任务。

因此,我将bootJar任务复制到jar任务并使用该选项。效果很好