问题描述
我在由 docker-compose.yml 文件管理并使用 portainer 进行可视化的 Docker 环境中使用 Spring-Boot 2.4.4。我正在使用 Spring-Boot 内置构建器(使用 paketo-buildpacks)构建我的 Docker 镜像
mvn spring-boot:build-image
我想用 spring-actuator 监控我的 Docker 容器。所以我添加了 maven 依赖项,当我在本地运行我的应用程序并访问特定页面时,我得到了想要的结果:
http://localhost:8080/actuator/health
由于我使用的是 Spring-Boot 内置 Docker 映像生成器,因此我没有 Dockerfile 来添加健康点。当我在 docker-compose.yml 中添加 healtheck 时,找不到 wget 命令:
healthcheck:
test: wget --spider --quiet 'http://localhost:8080/actuator/health/' || exit 1
interval: 10s
timeout: 3s
retries: 10
start_period: 10s
我做错了什么?我在网上找不到任何文档。我认为 Spring-Boot 能够自行检测弹簧执行器,但我认为它没有。
解决方法
用于运行 Spring Boot 应用程序的基本映像中不包含 wget
和 curl
命令。也许您可以挂载另一个实用程序卷:https://stackoverflow.com/a/65854305/8335251
或者,只需编写另一个用于请求健康执行器的轻量级 Java 应用程序,将结果映射到退出代码中。然后打包成jar,基于Spring Boot应用镜像用jar包构建另一个镜像。之后,可以使用 java -jar
命令运行健康检查。
您可以切换打包容器镜像时使用的构建器。请参阅image customization settings here。
默认构建器是 paketobuildpacks/builder:base
,它的运行映像不包含 curl
或 wget
。您可以将构建器切换到 paketobuildpacks/builder:full
,并且您应该拥有 curl
(也可能是 wget
,我不确定我的想法)。
这里的权衡是运行映像更大,因此您构建的映像的大小会增加。完整图像有相当多的内容和权重,大约为 1G,而基本图像大约为 100M。
Docker 在下载层方面很聪明,所以如果你有 50 个基于同一个完整构建器映像的应用程序,它不会导致下载 50G。 Docker(和其他容器运行时)只下载它没有的层,所以额外的演出基本上是一次性下载的。最终,您必须确定拥有 curl
的便利是否值得在图像中增加额外的尺寸。