虽然一切似乎都在我的本地计算机上运行;
每当我在 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 中)。
FROM node:18
WORKDIR /javascript
ENTRYPOINT npm install
Run Code Online (Sandbox Code Playgroud)
Dockerfile和package.json/文件的 git 存储库package-lock.json:https://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)
您需要检查几件事:
\nnpm是您的默认注册表npm config set registry=https://registry.npmjs.com/
node_modulesdir 到您的图像,如果是这样,在安装之前删除 node_modules 会更快ci =>npm ci| 归档时间: |
|
| 查看次数: |
9421 次 |
| 最近记录: |