我需要启动多个 nodejs 容器,怎么共享这些容器的 npm 包缓存

332 天前
 vevlins

在 k8s 集群上启动多个 nodejs 容器(隔离不同用户的代码),数量高至上万个,不同容器的依赖不完全相同。npm install 阶段不在 dockerfile 中,需要在容器启动后安装。核心诉求是:1. 降低安装时间。2.降低空间占用。

本来尝试 pnpm store ,想把 pnpm 全局缓存目录当作存储卷,启动时只需要 link 过去,但发现 k8s 不支持 link 。 有什么好办法吗?

3672 次点击
所在节点    Kubernetes
29 条回复
star7th
332 天前
不建议共享,就建议独立搞。
原因:
1 ,不同容器的依赖既然不同的话,那何必花力气去共享那一部分相同依赖?
2 ,磁盘空间不值钱,节省那边磁盘空间并不会有多少差距。至于内存消耗,你共享不共享,都一样的消耗。
3 ,若强制共享,打破了隔离性,反而会被后面增加很多维护成本。
yyttrr
332 天前
肯定要隔离,最好就扔到 dockerfile 里面自己搭建一个 npm 的包仓库,构建镜像的时候优先从自建 npm 仓库拉取
vevlins
332 天前
磁盘空间占用确实还不是大问题,主要是构建速度的考虑,把依赖放在 dockerfile 目前做不到,我做的是一个脚本平台,用户可以随时安装新的依赖。

目前考虑在 init 容器中搭建一个缓存服务器,从缓存服务器安装依赖。
pkoukk
332 天前
不建议共享,各种问题搞死人。而且最好用 lock 锁定依赖版本,我们这有些老项目没有 lock ,重新部署要解决一大堆兼容性问题
dolphintwo
332 天前
用 nexus3 做 npm 私有 registry
L1shen
332 天前
或者还有种方式,参考 web-contianer 那种,用户在前端就把代码打包完成,到你的容器的时候就可以直接运行
zy445566
332 天前
其实不能叫共享,但节约空间不是没有办法,你的目的其实也是节约空间是吧。
就是打成基础镜像,把必用 npm 打进去,上层继承下层镜像复用达到节约空间目的
Pastsong
332 天前
把 node_module 打在 image 里
seki
332 天前
空间占用没办法解决

安装时间可以用一个共享的缓存或者本地 registry 来加快速度


感觉最好的就是在创建镜像之前能打包的就打包,不能打包的二进制依赖在创建镜像时候安装
otakustay
332 天前
这是个 XY 问题吧,首先为什么要在启动后才安装依赖?
qq296015668
332 天前
@dolphintwo
Nexus3 确实省事
shadeofgod
332 天前
可以考虑拿 esbuild/tsup 之类的 bundle 一下,然后再去构建镜像,还可以获得一些性能增强
dcdlove
332 天前
为什么不在容器里用 pnpm 替换 npm ,建立好缓存后直接打包成一个通用得 base 镜像用于其他项目使用
codehz
332 天前
monorepo ,然后打包成 standalone 的脚本,最后放容器里(
paledream
332 天前
可以在打包阶段处理这部分共享依赖
xyjincan
332 天前
源码先打包,打包后在启动运行环境就简单了呀
sunxiaping521
332 天前
totoro52
332 天前
node_modules 真的能搞死人, 简直是磁盘杀手
wangmn
332 天前
laf.dev serverless 你试试这个开源架构
vevlins
332 天前
@wangmn laf 我用过,跟我的诉求不一样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/947895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX