运行Celery任务的Docker容器的HEALTHCHECK?

时间:2016-11-04 19:35:50

标签: docker

我知道检查Docker容器的运行状况的方法之一是使用命令

HEALTHCHECK CMD curl --fail http://localhost:3000/ || exit 1

但是如果工人没有这样的URL,那么如何检查容器的健康情况呢?

2 个答案:

答案 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-composedocker 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识别出工作者是否倒下或经纪人倒闭。