Docker构建Node.js API镜像失败:无法读取指定文件目录
针对你遇到的Error: ENOENT: no such file or directory, scandir '/app/api/products'错误,核心原因是容器内未正确复制本地的api/products目录,按以下步骤排查修复:
检查Dockerfile的COPY指令
确保你在安装依赖后,用COPY . .把本地项目根目录的所有文件(包括api目录)复制到容器的/app目录。很多人会只复制package*.json安装依赖,却漏掉复制源码目录,导致容器里缺少api/products。示例正确的Dockerfile片段:WORKDIR /app COPY package*.json ./ RUN npm install # 关键步骤:复制全部源码 COPY . .确认docker-compose的构建上下文
检查docker-compose.yml里build字段的context是否指向你的项目根目录(也就是包含api文件夹的那个目录)。如果上下文路径错误,Docker会找不到本地的api/products目录。排查.dockerignore文件
如果项目根目录有.dockerignore,打开检查是否存在api/products或者api/的排除规则,要是有就删除对应行,避免Docker复制时跳过该目录。临时验证容器内目录结构
可以在Dockerfile中添加一行调试命令,查看容器内的目录情况:COPY . . # 查看/api目录下的文件 RUN ls -la /app/api重新执行
docker-compose up --build,观察这一步的输出,确认products目录是否存在。
本地npm start能正常运行,说明源码本身没问题,问题完全出在Docker构建时的文件复制环节,按上面的步骤逐一排查就能解决。
内容的提问来源于stack exchange,提问作者msLA_Mac

