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

uurv41yg  于 2023-05-06  发布在  Docker
关注(0)|答案(5)|浏览(221)

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

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

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

tnkciper

tnkciper1#

celery inspect ping命令很方便,因为它完成了整个行程:它在代理上发送一个“ping”任务,工作者响应,celery 获取响应。
假设您的应用名为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并失败这可能不适合您的需求,代理不健康,而不是工作者。

inkz8wg9

inkz8wg92#

下面的示例代码段来自@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 -b amqp://rabbitmq:5672 inspect ping -d celery@$$HOSTNAME
        interval: 30s
        timeout: 10s
        retries: 3

请注意命令中多了一个$,因此$HOSTNAME实际上被传递到容器中。我也没有使用-A标志。
理想情况下,rabbitmq也应该有自己的健康检查,也许是curl guest:guest@localhost:15672/api/overview,因为docker无法辨别是worker停机还是broker停机。

xtfmy6hx

xtfmy6hx3#

对于celery 5.2.3,我使用celery -A [celery app name] status进行健康检查。这就是我的docker-compose文件的样子

worker:
      build: .
      healthcheck:
        test: celery -A app.celery_app status
        interval: 10s
        timeout: 10s
        retries: 10
      volumes:
          - ./app:/app
      depends_on:
        - broker
        - redis
        - database
s5a0g9ez

s5a0g9ez4#

降落在这个问题上寻找健康检查celery 工人的一部分,一个气流设置(气流2. 3. 4,celery 5. 2. 7),我最终弄明白了。这是原始问题的一个非常具体的用例,但对某些人来说可能仍然有用:

# docker-compose.yml

  worker:
      image: ...
      hostname: local-worker
      entrypoint: airflow celery worker
      ...
      healthcheck:
        test: [ "CMD-SHELL", 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"' ]
        interval: 5s
        timeout: 10s
        retries: 10
      restart: always
      ...

我从Airflow's quick-start Docker Compose得到了灵感。

jogvjijk

jogvjijk5#

就这么简单:

...
healthcheck:
    test: sh -c 'celery -A your_celery_module inspect ping'
    ...

您的日志文件将具有类似的ping日志:
[2023-05-05 11:18:47,309:DEBUG/MainProcess] pidbox收到方法ping()[reply_to:'exchange':'reply.celery. pidbox','routing_key':'8195241f-122a-3dc4-9841-739f55804b82'}票:bada7609-ce6b-499a-b3c2-c80911e0fe09]
此外,您可能希望在已经运行的容器中自己检查它。在这种情况下,它看起来像这样:

相关问题