我知道检查Docker容器的运行状况的方法之一是使用命令
HEALTHCHECK CMD curl --fail http://localhost:3000/ || exit 1
但是如果工人没有这样的URL,那么如何检查容器的健康情况呢?
答案 0 :(得分:10)
celery inspect ping
命令派上用场,因为它完成了一次旅程:它在代理上发送“ping”任务,工作人员响应并且芹菜提取响应。
假设您的应用名为tasks.add
,您可以ping所有工作人员:
/app $ celery inspect ping -A tasks.add
-> celery@aa7c21dd0e96: OK
pong
-> celery@57615db15d80: OK
pong
aa7c21dd0e96
是Docker主机名,因此可在$HOSTNAME
中使用。
要ping单个节点,您必须运行:
celery inspect ping -A tasks.add -d celery@$HOSTNAME
此处, d 代表目的地。
要添加到Dockerfile的行:
HEALTHCHECK CMD celery inspect ping -A tasks.add -d celery@$HOSTNAME
示例输出:
/app $ celery inspect ping -A tasks.add -d fake_node
Error: No nodes replied within time constraint.
/app $ echo $?
69
如果节点不存在或未回复
,则运行状况不佳/app $ celery inspect ping -A tasks.add -d celery@$HOSTNAME
-> celery@d39b3d31cc13: OK
pong
/app $ echo $?
0
节点回复pong
时健康。
/app $ celery inspect ping -d celery@$HOSTNAME
Traceback (most recent call last):
...
raise socket.error(last_err)
OSError: [Errno 111] Connection refused
/app $ echo $?
1
当代理不可用时不健康 - 我删除了应用程序,因此它尝试连接到本地AMPQ并失败 这可能不符合您的需求,经纪人不健康,而不是工人。
答案 1 :(得分:3)
下面的示例摘录源自@PunKeel发布的摘录,适用于希望在docker-compose.yml
中进行健康检查的用户,可以通过docker-compose
或docker stack deploy
使用。
worker:
build:
context: .
dockerfile: Dockerfile
image: myimage
links:
- rabbitmq
restart: always
command: celery worker --hostname=%h --broker=amqp://rabbitmq:5672
healthcheck:
test: celery inspect ping -b amqp://rabbitmq:5672 -d celery@$$HOSTNAME
interval: 30s
timeout: 10s
retries: 3
注意命令中多余的$
,以便$HOSTNAME
实际上被传递到容器中。我也没有使用-A
标志。
理想情况下,rabbitmq也应该进行自己的运行状况检查,也许使用curl guest:guest@localhost:15672/api/overview
,因为docker无法使用celery inspect ping
识别出工作者是否倒下或经纪人倒闭。