这几天项目上需要升级依赖并且重新打镜像,在这过程中 docker 镜像 npm install
报错 npm WARN tar ENOENT: no such file or directory
,本文记录了解决过程。
错误
docker 镜像中抛出的错误如下所示,看样子是 npm install
时没在目录里找到依赖包,我开始怀疑是不是版本升级了,node_modules
里还有旧版本缓存,导致与新版本不匹配而报错。开始的解决思路也是朝着清除缓存的方向,包括删除 package-lock.json
、node_modules
后重新安装,但是尝试下来一直都有相同问题。
后来发现在错误日志最后部分还有一段,如下图所示。
这里有个报错 npm ERR! code ENOENT npm ERR! syscall spawn git npm ERR! path git npm ERR! errno -2 npm ERR! enoent spawn git ENOENT
,顺着它才找到真正的原因:docker 容器内没有 git 环境。
解决方案
解决这个问题的方法就是把 git 给安装上去。项目镜像是基于 node:lts-alpine3.10
搭建的,因此通过 apk
命令安装 git 就好了。
1 | FROM node:lts-alpine3.10 |
根因
docker 抛出的 npm install
错误日志我们应该从后看,日志中最后的错误才是实际上的错误。在我们更新版本后,有一个依赖是通过 git https://github.com/formio/nodemailer-sendgrid-transport.git
方式指定的,因此需要 git 运行环境。而我们使用的基础镜像是 node:lts-alpine3.10
,里面很纯净,并没有 git,然后安装这个包的时候就抛错了,之后便 npm install
失败了。