我正在使用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"]
docker-compose.yml
中的将失败。(我检查了执行器本身工作正常)
我知道curl
或wget
不是理想的。实际上,我希望Paketo Builder能够挑选出类似于这个Health Checker BuildPack的东西。
是否有办法配置我的bootBuildImage
Gradle任务包括(或类似的)额外的BuildPack?
如上所述,我正在寻找一种易于维护的解决方案,并且不想编写自己的Dockerfile
以能够从Paketo提供的所有最佳实践中获利。
Health Checkers构建包还没有添加到主构建器中,但它完全可以用于您的应用程序。
指令修改
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
,所以你可以固定到最新的主要/次要或特定的版本。构建。
./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 ...
可选的。对生成的映像运行
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
运行你的app.
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,然后使用./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>