Docker Compose健康检查失败后容器未退出,需触发启动失败退出
解决方案
Docker 默认的健康检查只会标记容器状态为 unhealthy,不会主动终止容器。要实现健康检查失败时让容器退出并输出 failed to start container 错误,需要调整两处配置:
1. 给镜像安装 curl 工具
当前使用的 golang:1.21 镜像默认没有 curl,健康检查的 curl 命令会直接失败。修改 Dockerfile 添加 curl 安装步骤:
FROM golang:1.21 WORKDIR /src # 安装curl用于健康检查,清理apt缓存减小镜像体积 RUN apt-get update && apt-get install -y --no-install-recommends curl \ && rm -rf /var/lib/apt/lists/* COPY go.mod go.sum ./ RUN go mod download
2. 修改健康检查命令,失败时终止容器
在健康检查命令中,当 curl 请求失败时,先输出指定错误信息,再终止容器的主进程(PID 1,也就是 go run main.go 进程),这样容器就会随之退出。修改 Docker Compose 的 healthcheck 部分:
version: "3" services: app: build: . ports: - 8080:8080 volumes: - "./:/src" healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/fail-health-check || (echo \"failed to start container\" && kill 1)"] interval: 5s timeout: 5s retries: 1 command: ["go", "run", "main.go"]
说明
curl -f会在 HTTP 状态码 >=400 时返回非零退出码,触发后续的错误处理逻辑kill 1直接终止容器的主进程,Docker 会随之停止并退出容器- 配置的
retries:1意味着第一次健康检查失败就会执行退出逻辑,不会重复检查
重新构建并启动容器后,当 /fail-health-check 路径返回 404 时,容器会输出 failed to start container 并立即退出。
内容的提问来源于stack exchange,提问作者onemin
相关产品推荐
相关产品推荐

