Docker Google JIB 创建的图像不包含 spring rest 文档的 asciidoc

Docker Image created by Google JIB did not include asciidoc of spring rest docs

我使用 Spring Rest Docs 和 JIB

当我做 ./gradlew buildjava -jar /some/build/libs/app.jar 时。我可以在 example.com/docs/asciidocname.html.

获得由 spring rest 文档生成的 api 文档

但是 docker 带有 ./gradlew jib 的图像不包含此 url。

我想获取 Api 由 Spring Rest Docs 生成的文档 当我这样做时 ./gradlew jib

下面是我的一部分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 任务。这确保了 HTML 在 Jib 尝试将其包含在图像中之前已经生成。由于扩展和任务都命名为 jib,我们需要明确引用任务:

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

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

jibDockerBuild {
    dependsOn asciidoctor
}

我发现了另一种方法。

首先。 JIB 通过 java -cp 命令执行一个主要的 java class。未打包 .jar 个文件。

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

我可以在 jib gradle github.

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

所以我将我的 bootJar 任务复制到 jar 任务并使用该选项。效果不错