使用Dockerfile构建Node应用时提示找不到package.json如何解决
问题原因
- 构建阶段未复制源码到镜像内:你当前的Dockerfile仅指定了工作目录为
/app,但没有添加COPY指令将构建上下文(也就是./frontend目录)下的源码、package.json等文件复制到镜像内的/app路径,构建时镜像内的/app目录为空,自然无法找到package.json文件。 - 挂载卷不参与镜像构建:docker-compose.yml中配置的
volumes挂载是容器运行阶段才生效的配置,镜像构建过程不会加载挂载的本地目录,无法通过挂载的方式给构建阶段提供源码。 - 额外说明:你原有Dockerfile中的
RUN rm -rf node_modules是无效指令,构建初始阶段/app为空,没有可删除的文件。
解决方法
- 修改Dockerfile,添加文件复制逻辑,调整后的参考内容如下:
FROM node:16.8.0-alpine WORKDIR /app # 先复制依赖声明文件,可利用Docker缓存减少重复安装依赖的耗时 COPY package.json yarn.lock ./ RUN yarn install # 复制所有剩余源码 COPY . . RUN yarn build
- 可根据使用场景调整docker-compose配置:
- 如果是生产环境构建,不需要本地文件覆盖容器内的产物,可以直接删除
volumes配置项,避免本地未构建的源码覆盖镜像内的构建结果 - 如果是开发环境需要热更新保留挂载配置即可,该配置不影响镜像构建过程
- 如果是生产环境构建,不需要本地文件覆盖容器内的产物,可以直接删除
- 重新执行构建命令
docker-compose build即可正常完成构建。
内容的提问来源于stack exchange,提问作者DreamingCodes
相关产品推荐
相关产品推荐

