Npm 安装速度很慢,并且几乎每个库之后都会出现大量“缓存缺失”

pau*_*l23 11 node.js docker

虽然一切似乎都在我的本地计算机上运行;

每当我在 docker 中运行 nodejs (docker run node:18) 并克隆一个项目时,输入npm install以获取所有库并使用它们,速度非常慢。好像慢了10秒。

虽然它在这个初始碰撞后工作得很快,但我还注意到每个库(据我所知)(cache miss)在计时(大约 10 秒)后都附加了一个。发生了什么这是一个问题/我可以解决它吗?

只是强调一下:它发生在任何 docker 中,无论我使用 node-alpine、node docker,甚至只是 ubuntu docker 并在那里手动安装节点。


经过 @NaorTedgi 的一些提示后,我注意到这确实是因为该包位于 docker 外部并通过卷链接。我还注意到时间本身(15 秒)取决于它尝试加载的包的数量。对于单个包来说,它太快了,太容易被注意到,而对于一些包来说,它只有半秒。

因此,为了测试它,我采取以下步骤:

创建一个新目录 ( ~/javascript-test) 并将以下内容放入package.json文件中:

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "NODE_ENV=production node ./javascript/app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcryptjs": "^2.4.3",
    "connect-redis": "^6.1.3",
    "cookie-parser": "^1.4.6",
    "date-fns": "^2.28.0",
    "debug": "^4.3.3",
    "express": "^4.17.2",
    "express-session": "^1.17.2",
    "http-errors": "^2.0.0",
    "knex": "^2.1.0",
    "morgan": "^1.10.0",
    "multer": "^1.4.5-lts.1",
    "nanoid": "^3.3.4",
    "node-cron": "^3.0.1",
    "objection": "^3.0.1",
    "pg": "^8.7.1",
    "redis": "^4.2.0",
    "typescript": "^4.7.4",
    "uuid": "^8.3.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

打开此目录的 shell 并运行(以初始化package.json

npm install
rm -rf node_modules
Run Code Online (Sandbox Code Playgroud)

然后使用卷运行 docker(如果需要,显然使用 sudo):

docker run --name node-test --rm -it -v ~/javascript-test:/javascript node:18
Run Code Online (Sandbox Code Playgroud)

打开第二个shell(因为默认入口点不是sh来自节点泊坞窗)并执行:

docker exec -it node-test sh
Run Code Online (Sandbox Code Playgroud)

在 docker shell 内部:

cd javascript && npm install
Run Code Online (Sandbox Code Playgroud)

通过这些步骤,我注意到 2 秒后缓存未命中。

npm install最后我注意到,如果我确实删除了 node_modules 并在 docker 内再次重新安装模块 ( ),则不会发生缓存丢失。因此,要第二次测试,必须结束节点 docker 并重新运行它(docker run...在第一个 shell 中)。


对于那些喜欢 dockerfile 的人来说,这是仍然显示错误的最简单的文件(再次确保绑定包含上述 `package.json` 和相应的 `package-lock.json` 的卷)
FROM node:18
WORKDIR /javascript
ENTRYPOINT npm install
Run Code Online (Sandbox Code Playgroud)

Dockerfilepackage.json/文件的 git 存储库package-lock.jsonhttps://github.com/pulli23/docker-npm-test

运行它(如果克隆到~/dockertest

sudo docker build -t nodetest .  && sudo docker run --name node-test --rm -it -v ~/dockertest/javascript-test:/javascript nodetest
Run Code Online (Sandbox Code Playgroud)

Nao*_*dgi 5

您需要检查几件事:

\n
    \n
  1. 如果您使用多个注册表,请确保npm是您的默认注册表
  2. \n
\n

npm config set registry=https://registry.npmjs.com/

\n
    \n
  1. 如果您的项目存储库有 package-lock.json
  2. \n
\n
    \n
  • 然后确保您没有使用卷到当前目录node_modulesdir 到您的图像,如果是这样,在安装之前删除 node_modules 会更快
  • \n
  • 运行安装ci =>npm ci
  • \n
\n
    \n
  1. 确保您的 package-lock.json 是从容器内部的 \xe2\x80\x98npm i\xe2\x80\x99 命令生成的!在本地运行 npm i 将生成与本地节点版本兼容的库,如果是 c++ 附加组件,则根据您的操作系统生成 dll、so 或 dylib 文件
  2. \n
\n


Sla*_*sky 2

我猜这是与网络(fe 代理)或身份验证(fe 连接到企业存储库)相关的问题。您的本地连接有一些您的容器缺少的东西,也许是一些证书。

您应该进入容器并测试是否可以访问存储库。