繁体   English   中英

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

[英]Docker: Why can't a simple Dockerfile HEALTHCHECK based on grepping be accepted by 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 的目的是在所有需要的进程成功完成后无限期地阻止。 healthcheck 将在 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 $?

我们看到返回值为零!

所以...该命令适用于 bash。 为什么它不能在 docker 中按预期工作并被接受为 healthcheck 命令来报告docker ps中容器的健康状况?

CMD使用sh而不是bash运行命令。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM