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

Node.js本地正常运行,Docker环境下出现模块找不到问题

Docker环境下Discord Bot模块加载失败问题(已解决)

问题已解决,感谢@DavidMaze,修复提交记录:f240a30006a8af0e4886565f0f86bda35a4bce05

问题现象

更新Discord Bot后出现异常:仅Docker环境中触发模块找不到错误,本地运行完全正常。本地与Docker环境的Node.js版本及依赖完全一致,使用Docker入口脚本运行结果相同。问题始于提交69c0d99c85142d77148faeeac32347f7906ee51e。

错误日志

Node.js v19.7.0
node:internal/modules/cjs/loader:1093
throw err;
^

Error: Cannot find module '../database/birthdayCheck.js'
Require stack:

- /app/events/birthdayStatusChange.js
- /app/index.js
  at Module._resolveFilename (node:internal/modules/cjs/loader:1090:15)
  at Module._load (node:internal/modules/cjs/loader:934:27)
  at Module.require (node:internal/modules/cjs/loader:1157:19)
  at require (node:internal/modules/helpers:119:18)
  at Object.<anonymous> (/app/events/birthdayStatusChange.js:2:60)
  at Module._compile (node:internal/modules/cjs/loader:1275:14)
  at Module._extensions..js (node:internal/modules/cjs/loader:1329:10)
  at Module.load (node:internal/modules/cjs/loader:1133:32)
  at Module._load (node:internal/modules/cjs/loader:972:12)
  at Module.require (node:internal/modules/cjs/loader:1157:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/app/events/birthdayStatusChange.js', '/app/index.js' ]
  }

相关代码逻辑

index.js中的事件加载逻辑

// bot events handler
const eventsPath = path.join(__dirname, 'events');
const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js'));

for (const file of eventFiles) {
    const filePath = path.join(eventsPath, file);
    const event = require(filePath);
    if (event.once) {
        bot.once(event.name, (...args) => event.execute(...args));
    } else {
        bot.on(event.name, (...args) => event.execute(...args));
    }
}

events/birthdayStatusChange.js中加载模块的代码

const { isBirthdayCheckedToday, setLastBirthdayChecked } = require('../database/birthdayCheck.js');

被加载的database/birthdayCheck.js文件确实存在于项目根目录下的database文件夹中。

Docker相关配置

Dockerfile

FROM node:19.7.0

WORKDIR /app
COPY . .

RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y --no-install-recommends \
    ffmpeg \
    build-essential && \
    npm install --production && \
    npm install sodium --production && \
    apt remove -y build-essential && \
    apt autoremove -y && \
    rm -rf /var/lib/apt/lists/*

ENV DISCORD_API_TOKEN=

ENTRYPOINT ["./docker.startup.sh"]

docker.startup.sh

#!/bin/sh -e

cat > botinfo.js <<EOF
// token inserted via docker.startup.sh
exports.token = '${DISCORD_API_TOKEN}';
EOF

node index.js

docker-compose.yml

services:
  app:
    build:
      context:
        .
    restart: unless-stopped
    environment:
      - DISCORD_API_TOKEN=${DISCORD_API_KEY}
    volumes:
      - media:/app/sounds
      - database:/app/database

volumes:
  media:
  database:

期望结果

Bot能在Docker环境中正常运行,解决模块找不到的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:35:12