[英]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.