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
相关产品推荐
相关产品推荐

