Docker:为什么基于 grepping 的简单 Dockerfile HEALTHCHECK 不能被 docker 接受?



如果我理解正确的话,根据上面的例子,healthcheck命令保持"开始"标志。直到标志返回代码0,它才变为"健康"。我无法用这个简单的Dockerfile达到那个状态:

FROM ubuntu:latest
# find "sleep infinity" in ps -ax, and use as a way to decide that the execution finished
HEALTHCHECK --start-period=30s --interval=30s --timeout=4s --retries=1000 CMD [ "$(ps -ax | grep -i "sleep infinity" | grep -v grep | wc -l)" == 2 ] || exit 1
CMD echo "Hello, we're done with what we're supposed to do" && sleep infinity

此Dockerfile的目的是在所有所需进程成功完成后无限阻塞。健康检查将在docker-compose中使用,以命令容器执行。在实践中,这只是一个更新程序,必须在其他任何操作之前先运行。

通过构建和运行容器:

$ docker build . -t mytest
$ docker run  --name mytest-cont mytest

然后我们可以在另一个终端运行

$ watch docker ps

,我们会看到状态&;health: starting&;从未改变。

奇怪的是,用于健康检查的命令运行正常。如果我们输入容器:

$ docker exec -it mytest-cont /bin/bash

然后运行该命令,作为复制粘贴,然后检查退出代码,它返回零:

$ [ "$(ps -ax | grep -i "sleep infinity" | grep -v grep | wc -l)" == 2 ]
$ echo $?

返回值为0 !

所以…该命令在bash中工作。为什么在docker中没有按照预期工作,而在docker ps中被接受为healthcheck命令来报告容器的健康状况?

CMD正在与sh运行命令,而不是bash

所以你需要写= 2而不是== 2

最新更新