docker 容器内 npm install 报错 npm WARN tar ENOENT: no such file or directory

这几天项目上需要升级依赖并且重新打镜像,在这过程中 docker 镜像 npm install 报错 npm WARN tar ENOENT: no such file or directory,本文记录了解决过程。

错误

docker 镜像中抛出的错误如下所示,看样子是 npm install 时没在目录里找到依赖包,我开始怀疑是不是版本升级了,node_modules 里还有旧版本缓存,导致与新版本不匹配而报错。开始的解决思路也是朝着清除缓存的方向,包括删除 package-lock.jsonnode_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
2
3
FROM node:lts-alpine3.10

RUN apk update && apk upgrade && apk add git

根因

docker 抛出的 npm install 错误日志我们应该从后看,日志中最后的错误才是实际上的错误。在我们更新版本后,有一个依赖是通过 git https://github.com/formio/nodemailer-sendgrid-transport.git 方式指定的,因此需要 git 运行环境。而我们使用的基础镜像是 node:lts-alpine3.10,里面很纯净,并没有 git,然后安装这个包的时候就抛错了,之后便 npm install 失败了。