Spring Boot 构建带有健康检查的镜像

问题描述 投票:0回答:1

我正在使用 Spring Boot 内置的 Gradle

:bootBuildImage
任务构建我的 Docker 镜像,这非常方便,因为我不必维护自己的
Dockerfile

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

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

wget
,所以类似于
version: '3.7'

services:
  springBootApp:
    image: my/springboot/docker-image
    healthcheck:
      test: ["CMD-SHELL", "curl http://localhost:8080/actuator/health"]
       

in 
docker-compose.yml

将失败。 (我检查了执行器本身工作正常)

我知道 

curl

wget
并不理想。我实际上希望 Paketo Builder 能够选择这样的东西
Health Checker BuildPack
有没有办法配置我的

bootBuildImage

Gradle 任务以包含该(或类似的)附加 BuildPack?

如上所述,我正在寻找一种易于维护的解决方案,并且不想编写自己的 

Dockerfile

以便能够从 Paketo 提供的所有最佳实践中获益。

    

spring-boot docker docker-compose health-check paketo
1个回答
12
投票

使用说明

  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"] }

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

    注意

    您可能想要放入特定版本的健康检查器,这取决于您。它支持标准标签约定,例如 :1

    :1.4
    :1.4.0
    :latest
    ,因此您可以固定到最新的主要/次要版本或特定版本。

    注意

    健康检查器构建包 v2 中有重大更改请参阅发行说明

  2. 构建。
  3. ./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
    ...
    

  4. 可选,仅适用于运行状况检查器构建包的
  5. v1

    。针对生成的图像运行 pack inspect <image>。您可以看到健康检查器贡献了

    health-check
    流程类型。使用健康检查器构建包 v2,它不再提供进程类型,因为这
    导致了问题
    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

  6. 运行您的应用程序。
    • 对于健康检查器构建包 v1,运行
    • docker run -d --health-cmd /cnb/process/health-check -p 8080:8080 -e THC_PATH=/actuator/health <image>

      
      

    • 对于健康检查器构建包 v2,运行
    • docker run -d --health-cmd /workspace/health-check -p 8080:8080 -e THC_PATH=/actuator/health <image>

      
      

    • 默认使用的健康检查器是
    tiny-health-checker

    。它还有其他可以配置的环境变量,但对于 Spring Boot 应用程序,您只需要设置执行器路径(除非您以不同方式设置管理端口,然后也设置 THC_PORT=<management-port>

    
    

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

构建#2。

    <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>

	
© www.soinside.com 2019 - 2024. All rights reserved.