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

Alw*_*ner 13 celery docker

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

HEALTHCHECK CMD curl --fail http://localhost:3000/ || exit 1
Run Code Online (Sandbox Code Playgroud)

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

pun*_*eel 14

celery inspect ping命令派上用场,因为它完成了一次旅行:它在代理上发送"ping"任务,工作人员响应并且芹菜获取响应.

假设您的应用程序已命名tasks.add,您可以ping所有工作人员:

/app $ celery inspect ping -A tasks.add
-> celery@aa7c21dd0e96: OK
        pong
-> celery@57615db15d80: OK
        pong
Run Code Online (Sandbox Code Playgroud)

随着aa7c21dd0e96作为泊坞窗主机名,从而获得$HOSTNAME.

要ping单个节点,您必须运行:

celery inspect ping -A tasks.add -d celery@$HOSTNAME
Run Code Online (Sandbox Code Playgroud)

这里,d代表目的地.

要添加到Dockerfile的行:

HEALTHCHECK CMD celery inspect ping -A tasks.add -d celery@$HOSTNAME
Run Code Online (Sandbox Code Playgroud)

样本输出:

/app $ celery inspect ping -A tasks.add -d fake_node
Error: No nodes replied within time constraint.
/app $ echo $?
69
Run Code Online (Sandbox Code Playgroud)

如果节点不存在或没有回复,则不健康

/app $ celery inspect ping -A tasks.add -d celery@$HOSTNAME
-> celery@d39b3d31cc13: OK
        pong
/app $ echo $?
0
Run Code Online (Sandbox Code Playgroud)

节点回复时健康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
Run Code Online (Sandbox Code Playgroud)

当代理不可用时不健康 - 我删除了应用程序,因此它尝试连接到本地AMPQ并且失败这可能不适合您的需求,代理是不健康的,而不是工作者.

  • 有了SQS,你怎么办?你不能使用 sqs 和芹菜的结果 http://docs.celeryproject.org/en/master/getting-started/brokers/sqs.html#broker-sqs (4认同)
  • 对于 SQS,您可以使用 `--pidfile /opt/celery/celery_pid` 指定 pidfile,并使用 `kill -0 $(cat /opt/celery/celery_pid)` 检查进程是否仍在运行。这是从运行 masterpoint.io 的人那里得到的。 (3认同)

ten*_*eng 5

下面的示例片段源自@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
Run Code Online (Sandbox Code Playgroud)

注意$命令中的额外内容,以便$HOSTNAME实际传递到容器中。我也没有使用-A标志。

理想情况下,rabbitmq 也应该有自己的健康检查,也许是curl guest:guest@localhost:15672/api/overview,因为 docker 将无法辨别是 worker 宕机还是 broker 宕机了celery inspect ping

  • 需要更改顺序:`celery -b amqp://rabbitmq:5672 inform ping` (2认同)