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

无法捕获Docker容器启动/停止事件的技术求助

解决Docker容器启动/停止事件无法捕获的问题

问题排查与修复步骤

  1. 确认事件监听时机
    如果先执行docker compose up -d启动容器,再运行监听脚本,容器启动的事件已经发生,脚本自然无法捕获。正确顺序是:先启动监听脚本,再执行容器启动命令,这样才能捕获实时产生的事件。

  2. 替换过时的docker-events库,使用dockerode原生API
    docker-events库已多年未维护,与新版Docker API存在兼容性问题。直接使用dockerode的原生getEvents方法更可靠,代码示例:

const Docker = require('dockerode');

const docker = new Docker({ socketPath: '/var/run/docker.sock' });

// 配置过滤器,只监听容器的启动(start)和停止(die)事件
const eventOptions = {
  filters: JSON.stringify({
    type: ['container'],
    event: ['start', 'die']
  })
};

// 获取事件流并监听
docker.getEvents(eventOptions)
  .then(stream => {
    console.log('Started listening for container events...');
    
    stream.on('data', chunk => {
      try {
        const event = JSON.parse(chunk.toString());
        console.log(`[${event.Action}] Container: ${event.Actor.Attributes.name}`);
      } catch (parseErr) {
        console.error('Failed to parse event:', parseErr);
      }
    });

    stream.on('error', err => {
      console.error('Event stream error:', err);
    });

    stream.on('end', () => {
      console.log('Event stream disconnected');
    });
  })
  .catch(err => {
    console.error('Failed to start event listener:', err);
  });
  1. 验证用户权限(可选)
    虽然/var/run/docker.sock权限为srw-rw-rw-,仍需确保运行脚本的用户属于docker组:
    • 执行groups命令查看当前用户组,确认包含docker
    • 如果没有,执行sudo usermod -aG docker $USER,重新登录后生效

原代码问题说明

你之前使用的docker-events库因版本兼容问题,无法正确解析新版Docker的事件流;直接监听stream的data事件无效,大概率是因为没有正确获取dockerode的事件流对象,或者存在事件时机不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:12