Spring Boot 构建镜像并进行健康检查

Ste*_*erl 3 docker spring-boot docker-compose health-check paketo

我正在使用 Spring Boot 内置的 Gradle:bootBuildImage任务构建我的 Docker 映像,这非常方便,因为我不必维护自己的Dockerfile.

Gradle 任务在底层使用Paketo Bionic Base Stack ,并且可以很好地构建分层的 Docker 镜像。

现在,一些编排引擎,如 Docker Swarm(或用于开发目的的 Docker Compose)容器内执行运行状况检查。然而不幸的是,生成的 Spring Boot Docker 镜像没有任何类似curlwget安装的健康检查工具,所以类似

version: '3.7'

services:
  springBootApp:
    image: my/springboot/docker-image
    healthcheck:
      test: ["CMD-SHELL", "curl http://localhost:8080/actuator/health"]
       
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml将会失败。(我检查了执行器本身工作正常)

我知道这curl并不wget理想。我实际上希望 Paketo Builder 能够选择像Health Checker BuildPack这样的东西。

有没有办法配置我的bootBuildImageGradle 任务以包含该(或类似的)附加 BuildPack?

如上所述,我正在寻找一种易于维护的解决方案,并且不想编写自己的解决方案Dockerfile以便能够从 Paketo 提供的所有最佳实践中获益。

Dan*_*usa 9

Health Checkers 构建包尚未添加到主构建器中,但它完全可以与您的应用程序一起使用。

指示

  1. 修改你的build.gradle文件

    tasks.named("bootBuildImage") {
      environment["BP_HEALTH_CHECKER_ENABLED"] = "true"
      buildpacks = ["urn:cnb:builder:paketo-buildpacks/java", "gcr.io/paketo-buildpacks/health-checker:latest"]
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这将在构建时设置一个环境变量,指示健康检查器构建包参与。它还告诉 Spring Boot 构建工具将运行状况检查器构建包附加到默认情况下构建器中附带的 Java 构建包列表中。

    请注意,您可能想要放入特定版本的健康检查器,这取决于您。它支持标准标签约定,例如:1:1.4、 ,:1.4.0因此:latest您可以固定到最新的主要/次要版本或特定版本。

  2. 建造。 ./gradlew bootBuildImage。您将看到检测中包含健康检查器构建包。

    [creator]     ===> DETECTING
    [creator]     7 of 27 buildpacks participating
    [creator]     paketo-buildpacks/ca-certificates   3.6.0
    [creator]     paketo-buildpacks/bellsoft-liberica 10.0.0
    [creator]     paketo-buildpacks/syft              1.26.0
    [creator]     paketo-buildpacks/executable-jar    6.6.2
    [creator]     paketo-buildpacks/dist-zip          5.5.2
    [creator]     paketo-buildpacks/spring-boot       5.23.0
    [creator]     paketo-buildpacks/health-checker    1.3.1
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 选修的。pack inspect <image>针对生成的图像运行。可以看到健康检查器贡献了一个health-check进程类型。

    Processes:
      TYPE                  SHELL        COMMAND        ARGS                                               WORK DIR
      web (default)                      java           org.springframework.boot.loader.JarLauncher        /workspace
      executable-jar                     java           org.springframework.boot.loader.JarLauncher        /workspace
      health-check                       thc                                                               /workspace
      task                               java           org.springframework.boot.loader.JarLauncher        /workspace
    
    Run Code Online (Sandbox Code Playgroud)
  4. 运行您的应用程序。docker run -d --health-cmd /cnb/process/health-check -p 8080:8080 -e THC_PATH=/actuator/health <image>

    默认使用的运行状况检查器是tiny-health-checker。它还有其他可以配置的环境变量,但对于 Spring Boot 应用程序,您只需要设置执行器路径(除非您设置了不同的管理端口,然后THC_PORT=<management-port>也进行设置。

如果您是 Maven 用户,该过程非常相似。只需将这些说明替换为步骤#1,然后用#2 构建./mvnw spring-boot:build-image

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <layers>
                <enabled>true</enabled>
            </layers>
            <image>
                <env>
                    <BP_HEALTH_CHECKER_ENABLED>true</BP_HEALTH_CHECKER_ENABLED>
                </env>
                <buildpacks>
                    <buildpack>urn:cnb:builder:paketo-buildpacks/java</buildpack>
                    <buildpack>gcr.io/paketo-buildpacks/health-checker:latest</buildpack>
                </buildpacks>
            </image>
        </configuration>
    </plugin>
Run Code Online (Sandbox Code Playgroud)

  • 将来,这就足够了。目前,必须手动添加构建包。 (2认同)