虽然一切似乎都在我的本地计算机上运行;
每当我在 docker (docker run node:18) 中运行 nodejs 并克隆一个项目时,输入
npm install
来获取所有库并使用它们,速度非常慢。好像慢了10秒。
虽然它在最初的碰撞后工作得很快,但我还注意到每个库(据我所知)在计时(大约 10 秒)后都附加了一个
(cache miss)
。发生了什么事这是一个问题/我可以解决它吗?
强调一下:它发生在任何 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"
}
}
打开此目录的 shell 并运行(初始化
package.json
)
npm install
rm -rf node_modules
然后使用该卷运行 docker(如果需要,显然可以使用 sudo):
docker run --name node-test --rm -it -v ~/javascript-test:/javascript node:18
打开second shell(因为默认入口点不是来自节点泊坞窗的
sh
)并执行:
docker exec -it node-test sh
docker shell 内部:
cd javascript && npm install
通过这些步骤,我注意到 2 秒后缓存未命中。
最后我注意到,如果我确实删除了node_modules并在docker中再次重新安装模块(
npm install
),则不会发生缓存丢失。因此,要第二次测试,必须结束节点 docker 并重新运行它(在第一个 shell 中docker run...
)。
FROM node:18
WORKDIR /javascript
ENTRYPOINT npm install
Dockerfile
和package.json
/package-lock.json
文件的git存储库: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
您需要检查的几件事:
npm
是您的默认注册表npm config set registry=https://registry.npmjs.com/
node_modules
dir到您的图像,如果是这样,在安装之前删除node_modules会更快ci
=> npm ci
npm i
将生成与您的本地节点版本兼容的库,如果是 C++ 附加组件,则会根据您的操作系统生成 dll、so 或 dylib 文件我的猜测是与网络(例如代理)或身份验证(例如与企业存储库的连接)相关的问题。您的本地连接有一些您的容器缺少的东西,也许是一些证书。
您应该进入容器并测试是否可以访问存储库。