无法捕获Docker容器启动/停止事件的技术求助
解决Docker容器启动/停止事件无法捕获的问题
问题排查与修复步骤
确认事件监听时机
如果先执行docker compose up -d启动容器,再运行监听脚本,容器启动的事件已经发生,脚本自然无法捕获。正确顺序是:先启动监听脚本,再执行容器启动命令,这样才能捕获实时产生的事件。替换过时的
docker-events库,使用dockerode原生APIdocker-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); });
- 验证用户权限(可选)
虽然/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
相关产品推荐
相关产品推荐

