You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置docker-compose,使队列Worker容器满足条件后再停止?

解决方案

直接通过docker-compose.yml的基础配置无法实现这种条件判断式的停止逻辑,但可以利用Docker Compose的停止钩子(Stop Hooks) 结合自定义脚本,完美兼容标准的docker-compose up/down命令,实现你的需求。

核心思路

利用Compose v2.16.0及以上版本支持的服务停止钩子,在执行docker-compose down时自动触发队列检查脚本:

  • 脚本循环检查队列是否为空,为空则立即退出,让容器正常停止
  • 若队列不为空则持续等待,直到队列为空或达到设定的最大等待时长
  • 配合足够长的stop_grace_period,避免Compose强制杀死容器

具体实现步骤

1. 编写队列检查脚本

创建wait-for-empty-queue.sh脚本,替换成你实际的队列检查逻辑:

#!/bin/bash
set -e

# 自定义检查队列是否为空的逻辑,示例用redis-cli直接检查队列长度
check_queue() {
  # 替换成你的Redis队列名称
  QUEUE_NUM=$(redis-cli -h redis llen your-queue-name)
  [ "$QUEUE_NUM" -eq 0 ]
}

# 配置最大等待时长(秒)和检查间隔
MAX_WAIT=1800  # 30分钟
CHECK_INTERVAL=10
ELAPSED_TIME=0

while ! check_queue; do
  if [ "$ELAPSED_TIME" -ge "$MAX_WAIT" ]; then
    echo "队列仍有任务,已达最大等待时长,将停止容器"
    exit 1
  fi
  echo "队列未清空,等待中... 已等待${ELAPSED_TIME}/${MAX_WAIT}秒"
  sleep $CHECK_INTERVAL
  ELAPSED_TIME=$((ELAPSED_TIME + CHECK_INTERVAL))
done

echo "队列为空,准备停止容器"

给脚本添加执行权限:chmod +x wait-for-empty-queue.sh

2. 修改docker-compose.yml配置

在queue-worker服务中添加停止钩子,并挂载脚本、设置足够长的优雅停止时长:

services:
  redis:
    image: redis:alpine
    # 你的Redis配置(端口、数据卷等)

  queue-worker:
    image: your-worker-image:latest
    stop_grace_period: 35m  # 需比脚本的MAX_WAIT长,留冗余时间
    hooks:
      stop:
        exec:
          command: ["/wait-for-empty-queue.sh"]
    volumes:
      - ./wait-for-empty-queue.sh:/wait-for-empty-queue.sh:ro  # 挂载脚本到容器内
    # 你的worker其他配置(环境变量、依赖关系等)

3. 注意事项

  • 确保容器内有脚本依赖的工具:如果用redis-cli,需保证worker镜像包含该工具(可基于redis镜像扩展,或在Dockerfile中安装)
  • 确认Docker Compose版本:钩子功能需要v2.16.0及以上,可通过docker-compose --version检查
  • 脚本退出码:脚本返回0时,Compose会立即停止容器;返回非0时,Compose会在stop_grace_period结束后强制停止容器

备选方案(别名覆盖)

如果无法使用钩子功能(比如Compose版本过低),可以通过shell别名覆盖docker-compose down命令,先执行检查再执行down:

alias docker-compose='function _dc() {
  if [ "$1" = "down" ]; then
    while ! redis-cli -h redis llen your-queue-name | grep -q 0; do
      echo "队列未清空,等待中..."
      sleep 10
    done
    command docker-compose down
  else
    command docker-compose "$@"
  fi
}; _dc'

将上述代码添加到你的~/.bashrc或~/.zshrc中,生效后即可用标准命令执行。

内容的提问来源于stack exchange,提问作者Scratcha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:50:29