我知道检查Docker容器健康状况的方法之一是使用命令
HEALTHCHECK CMD curl --fail http://localhost:3000/ || exit 1
但是如果工人没有这样的URL来命中,如何检查容器的健康在这种情况下?
tnkciper1#
celery inspect ping命令很方便,因为它完成了整个行程:它在代理上发送一个“ping”任务,工作者响应,celery 获取响应。假设您的应用名为tasks.add,您可以ping通所有工作进程:
celery inspect ping
tasks.add
/app $ celery inspect ping -A tasks.add -> celery@aa7c21dd0e96: OK pong -> celery@57615db15d80: OK pong
其中aa7c21dd0e96是Docker主机名,因此在$HOSTNAME中可用。要ping单个节点,必须运行:
aa7c21dd0e96
$HOSTNAME
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时为健康状态。
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并失败这可能不适合您的需求,代理不健康,而不是工作者。
inkz8wg92#
下面的示例代码段来自@PunKeel发布的代码段,适用于那些希望在docker-compose.yml中实现健康检查的人,可以通过docker-compose或docker stack deploy使用。
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也应该有自己的健康检查,也许是curl guest:guest@localhost:15672/api/overview,因为docker无法辨别是worker停机还是broker停机。
$
-A
curl guest:guest@localhost:15672/api/overview
xtfmy6hx3#
对于celery 5.2.3,我使用celery -A [celery app name] status进行健康检查。这就是我的docker-compose文件的样子
celery -A [celery app name] status
worker: build: . healthcheck: test: celery -A app.celery_app status interval: 10s timeout: 10s retries: 10 volumes: - ./app:/app depends_on: - broker - redis - database
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得到了灵感。
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]此外,您可能希望在已经运行的容器中自己检查它。在这种情况下,它看起来像这样:
5条答案
按热度按时间tnkciper1#
celery inspect ping
命令很方便,因为它完成了整个行程:它在代理上发送一个“ping”任务,工作者响应,celery 获取响应。假设您的应用名为
tasks.add
,您可以ping通所有工作进程:其中
aa7c21dd0e96
是Docker主机名,因此在$HOSTNAME
中可用。要ping单个节点,必须运行:
在这里,d 代表 * 目的地 *。
要添加到Dockerfile的行:
样本输出:
如果节点不存在或不回复,则为非健康状态
当节点回复
pong
时为健康状态。当代理不可用时不健康-我删除了应用程序,因此它尝试连接到本地AMPQ并失败这可能不适合您的需求,代理不健康,而不是工作者。
inkz8wg92#
下面的示例代码段来自@PunKeel发布的代码段,适用于那些希望在
docker-compose.yml
中实现健康检查的人,可以通过docker-compose
或docker stack deploy
使用。请注意命令中多了一个
$
,因此$HOSTNAME
实际上被传递到容器中。我也没有使用-A
标志。理想情况下,rabbitmq也应该有自己的健康检查,也许是
curl guest:guest@localhost:15672/api/overview
,因为docker无法辨别是worker停机还是broker停机。xtfmy6hx3#
对于celery 5.2.3,我使用
celery -A [celery app name] status
进行健康检查。这就是我的docker-compose文件的样子s5a0g9ez4#
降落在这个问题上寻找健康检查celery 工人的一部分,一个气流设置(气流2. 3. 4,celery 5. 2. 7),我最终弄明白了。这是原始问题的一个非常具体的用例,但对某些人来说可能仍然有用:
我从Airflow's quick-start Docker Compose得到了灵感。
jogvjijk5#
就这么简单:
您的日志文件将具有类似的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]
此外,您可能希望在已经运行的容器中自己检查它。在这种情况下,它看起来像这样: