Node+Express应用Docker运行报MODULE_NOT_FOUND错误如何解决
核心问题排查思路
你遇到的MODULE_NOT_FOUND报错指向容器内不存在/app/bin/www文件,虽然Dockerfile写了COPY . /app,但实际构建过程中该文件并没有被正确复制到镜像中,可按以下步骤定位和解决:
第一步:验证镜像内的目录结构
首先执行以下命令直接查看镜像内/app目录的真实文件列表,确认是否缺少bin目录或www文件:
docker run --rm --entrypoint sh myuser/redbici -c "ls -la /app && ls -la /app/bin 2>/dev/null"
根据输出结果对应处理:
常见原因1:.dockerignore文件过滤了bin目录
绝大多数这类问题都是因为项目根目录下的.dockerignore配置了忽略规则,不小心把bin目录排除在了复制范围外。比如很多人会直接复制.gitignore的规则到.dockerignore,或者写了类似bin/、**/bin的忽略规则。
解决方案:
打开项目根目录的.dockerignore文件,删除所有会匹配到bin目录的忽略规则,之后重新构建镜像即可。
常见原因2:文件名/目录名大小写不匹配
如果你本地开发环境是Windows或macOS,这类系统对文件名大小写不敏感,哪怕你本地目录是Bin/或者文件是WWW,npm start都能正常运行,但Docker容器默认是Linux环境,对路径大小写完全敏感,就会找不到文件。
解决方案:
检查本地项目的目录和文件名,确保目录是小写bin,目录下的文件是小写www,修正后重新构建镜像。
常见原因3:构建镜像时上下文路径错误
如果执行docker build命令的当前目录不是你的项目根目录(即包含bin目录、package.json的目录),或者指定的上下文路径不对,COPY . /app就会复制错误路径下的内容,自然没有目标文件。
解决方案:
进入项目根目录(和Dockerfile、package.json同层级的目录),执行构建命令:
docker build -t myuser/redbici .
构建完成后再启动容器即可正常运行。
内容的提问来源于stack exchange,提问作者sar

