Docker配置Healthcheck后容器始终显示unhealthy问题求助
问题原因
- 你使用的
node:12-alpine是极简发行版镜像,默认没有预装curl工具,健康检查命令在容器内部执行时会直接报错返回非0状态码,因此被标记为unhealthy。你在宿主机访问3000端口正常仅代表端口映射和服务本身正常,和容器内部的执行环境无关。 - 第一种修改Dockerfile的方案中,你没有在系统依赖安装步骤里添加curl,所以即使配置了HEALTHCHECK指令,运行时也无法执行检测命令。
解决方案
你可以选择以下任意一种方案解决问题:
方案1:安装curl工具后配置健康检查
修改Dockerfile,在系统依赖安装步骤中添加curl,再配置健康检查,修改后的示例如下:
# syntax=docker/dockerfile:1 FROM node:12-alpine RUN apk add --no-cache python g++ make curl HEALTHCHECK --interval=3s --timeout=1s CMD curl --fail http://localhost:3000 || exit 1 WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"]
重新构建镜像后启动容器即可正常触发健康检查。
方案2:使用alpine默认自带的wget做健康检查(无需额外安装依赖)
alpine镜像默认预装了wget工具,你可以直接替换健康检查命令,不需要修改镜像依赖:
- 如果是在Dockerfile中配置HEALTHCHECK,替换指令为:
HEALTHCHECK --interval=3s --timeout=1s CMD wget --no-verbose --tries=1 --spider http://localhost:3000 || exit 1
- 如果是在启动命令中直接加参数,使用以下命令即可:
docker run -dp 3000:3000 --health-cmd "wget --no-verbose --tries=1 --spider http://localhost:3000 || exit 1" getting-started
你可以先进入运行中的容器执行对应的检测命令,验证命令是否可以正常返回结果:
# 验证curl是否可用 docker exec <你的容器ID> curl http://localhost:3000 # 验证wget是否可用 docker exec <你的容器ID> wget http://localhost:3000
内容的提问来源于stack exchange,提问作者Orielno
相关产品推荐
相关产品推荐

