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

Docker容器运行Discord Bot出现ConnectTimeoutError问题求助

Discord Bot在Docker容器内调用Message.react/reply时出现连接超时的排查方案

问题概述

我开发的Discord Bot在Docker外部运行完全正常,但在容器内可成功登录并触发消息接收逻辑,唯独调用Message.react()或Message.reply()时抛出UND_ERR_CONNECT_TIMEOUT连接超时错误。已尝试重置Token、使用host网络、开放80/443端口、容器内curl访问discord.com等操作,问题仍未解决。

核心排查与解决方向

1. 网络路径深层验证

虽然容器能curl访问discord.com,但登录/消息接收依赖WebSocket,而回复/反应调用的是REST API,两者网络路径可能存在差异:

  • 在容器内直接请求Discord API的具体端点(比如https://discord.com/api/v10/channels/{channel_id}/messages),验证是否能正常响应
  • 用traceroute或mtr工具追踪容器到discord.com的网络路径,排查是否存在丢包或高延迟节点
  • 检查宿主机防火墙/安全组规则,确认是否对容器发起的HTTPS请求有隐性限制

2. Node.js网络配置适配

错误来自Discord.js底层依赖的undici库,可针对性调整:

  • 在代码中显式延长HTTP客户端超时时间:
    const { Client } = require('discord.js');
    const client = new Client({
      http: {
        timeout: 30000, // 延长至30秒
      },
    });
    
  • 确认容器内Node.js版本与宿主机一致,避免不同版本网络栈的兼容性问题

3. Docker配置简化与优化

Dockerfile中手动编译curl的操作冗余且可能引入环境冲突,建议简化:

  • 优化后的Dockerfile:
    FROM node:20.8.0
    ENV NODE_ENV=production
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm ci --only=production
    COPY . .
    RUN chown -R node:node /usr/src/app
    USER node
    RUN npm run build
    CMD ["npm", "start"]
    
  • 运行容器时不要同时指定--network=host和-p参数(host模式下端口映射无效),直接执行:
    docker run --network=host -it foo
    

4. 认证与权限再次确认

  • 重置Token后重新生成Bot的OAuth2邀请链接,确保SendMessages、AddReactions等必要权限已正确配置并生效
  • 在容器内执行echo $DISCORD_TOKEN,验证环境变量是否完整加载

5. DNS与代理排查

  • 用nslookup discord.com验证容器内DNS解析是否正常,若异常可指定公共DNS服务器运行容器:
    docker run --network=host --dns=8.8.8.8 -it foo
    
  • 若宿主机使用代理,清空容器内代理环境变量再测试:
    docker run --network=host -e HTTP_PROXY= -e HTTPS_PROXY= -it foo
    

临时调试方案

添加详细日志定位具体请求问题:

client.on('messageCreate', async (msg) => {
  console.log('Message received:', msg.content);
  try {
    if (msg.content === 'ping') {
      console.log('Attempting to reply to ping...');
      const reply = await msg.reply('Pong!');
      console.log('Reply sent successfully:', reply.id);
    }
    // 其他逻辑...
  } catch (e) {
    console.error('Full error details:', e);
    console.error('Request URL:', e.request?.url);
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:15:33