我知道检查 Docker 容器运行状况的方法之一是使用命令
HEALTHCHECK CMD curl --fail http://localhost:3000/ || exit 1
但是如果是工人,则没有这样的 URL 可以点击,在这种情况下如何检查容器的健康状况?
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 但失败 这可能不适合您的需求,经纪人不健康,而不是工人。
下面的示例片段源自 @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 -b amqp://rabbitmq:5672 inspect ping -d celery@$$HOSTNAME
interval: 30s
timeout: 10s
retries: 3
请注意命令中额外的
$
,以便 $HOSTNAME
实际上被传递到容器中。我也没有使用 -A
标志。
理想情况下,rabbitmq 也应该有自己的健康检查,也许使用
rabbitmqctl status
,因为 docker 将无法通过 celery inspect ping
辨别工人是否宕机或代理是否宕机。
-- 编辑:
另请查看
SomeGuyOnAComputer
提供的解决方案
使用 kill -0 $PID
检查 PID 是否处于活动状态。
对于 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
在这个问题上寻找 Celery 工作人员的健康检查作为 Airflow 设置的一部分(Airflow 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 的快速启动 Docker Compose 中获得了灵感。
为运行 Celery 任务的 Docker 容器配置 HEALTHCHECK 并确保另一个容器依赖于其健康状态:
在您的 Docker Compose 文件中:
version: "3.8"
services:
celery:
# Celery container config
healthcheck:
test: celery inspect ping
interval: 1m
timeout: 10s
retries: 10
start_period: 1m
dependent_container:
# Dependent container config
depends_on:
celery:
condition: service_healthy
这将使用
celery
为 celery inspect ping
容器设置运行状况检查。 dependent_container
取决于 celery
和 condition: service_healthy
,确保仅当 celery
健康时才启动。
就这么简单:
...
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]
此外,您可能想在已经运行的容器中亲自检查它。在这种情况下,它会看起来像这样: