在 k8s 集群上启动多个 nodejs 容器(隔离不同用户的代码),数量高至上万个,不同容器的依赖不完全相同。npm install 阶段不在 dockerfile 中,需要在容器启动后安装。核心诉求是:1. 降低安装时间。2.降低空间占用。
本来尝试 pnpm store ,想把 pnpm 全局缓存目录当作存储卷,启动时只需要 link 过去,但发现 k8s 不支持 link 。 有什么好办法吗?
|      1star7th      2023-06-12 10:39:25 +08:00  2 不建议共享,就建议独立搞。 原因: 1 ,不同容器的依赖既然不同的话,那何必花力气去共享那一部分相同依赖? 2 ,磁盘空间不值钱,节省那边磁盘空间并不会有多少差距。至于内存消耗,你共享不共享,都一样的消耗。 3 ,若强制共享,打破了隔离性,反而会被后面增加很多维护成本。 | 
|      2yyttrr      2023-06-12 10:58:45 +08:00  1 肯定要隔离,最好就扔到 dockerfile 里面自己搭建一个 npm 的包仓库,构建镜像的时候优先从自建 npm 仓库拉取 | 
|  |      3vevlins OP 磁盘空间占用确实还不是大问题,主要是构建速度的考虑,把依赖放在 dockerfile 目前做不到,我做的是一个脚本平台,用户可以随时安装新的依赖。 目前考虑在 init 容器中搭建一个缓存服务器,从缓存服务器安装依赖。 | 
|  |      4pkoukk      2023-06-12 11:02:19 +08:00  1 不建议共享,各种问题搞死人。而且最好用 lock 锁定依赖版本,我们这有些老项目没有 lock ,重新部署要解决一大堆兼容性问题 | 
|  |      5dolphintwo      2023-06-12 11:04:59 +08:00  1 用 nexus3 做 npm 私有 registry | 
|  |      6L1shen      2023-06-12 11:19:07 +08:00  1 或者还有种方式,参考 web-contianer 那种,用户在前端就把代码打包完成,到你的容器的时候就可以直接运行 | 
|  |      7zy445566      2023-06-12 11:30:16 +08:00  1 其实不能叫共享,但节约空间不是没有办法,你的目的其实也是节约空间是吧。 就是打成基础镜像,把必用 npm 打进去,上层继承下层镜像复用达到节约空间目的 | 
|  |      8Pastsong      2023-06-12 11:32:35 +08:00  1 把 node_module 打在 image 里 | 
|  |      9seki      2023-06-12 11:40:05 +08:00  1 空间占用没办法解决 安装时间可以用一个共享的缓存或者本地 registry 来加快速度 感觉最好的就是在创建镜像之前能打包的就打包,不能打包的二进制依赖在创建镜像时候安装 | 
|  |      10otakustay      2023-06-12 11:50:45 +08:00  2 这是个 XY 问题吧,首先为什么要在启动后才安装依赖? | 
|  |      11qq296015668      2023-06-12 12:50:26 +08:00 @dolphintwo  Nexus3 确实省事 | 
|      12shadeofgod      2023-06-12 13:30:46 +08:00 可以考虑拿 esbuild/tsup 之类的 bundle 一下,然后再去构建镜像,还可以获得一些性能增强 | 
|  |      13dcdlove      2023-06-12 14:03:50 +08:00 为什么不在容器里用 pnpm 替换 npm ,建立好缓存后直接打包成一个通用得 base 镜像用于其他项目使用 | 
|  |      14codehz      2023-06-12 14:15:42 +08:00 monorepo ,然后打包成 standalone 的脚本,最后放容器里( | 
|  |      15paledream      2023-06-12 14:23:20 +08:00 可以在打包阶段处理这部分共享依赖 | 
|  |      16xyjincan      2023-06-12 14:31:56 +08:00 源码先打包,打包后在启动运行环境就简单了呀 | 
|      17sunxiaping521      2023-06-12 16:39:59 +08:00 | 
|  |      18MIUIOS      2023-06-12 16:54:28 +08:00 node_modules 真的能搞死人, 简直是磁盘杀手 | 
|  |      21ETiV      2023-06-12 17:19:54 +08:00 via iPhone  1 “npm install 不在 dockerfile” 还不听劝 😂 有个梗图:容器化是为了解决“在我这儿好使、在对方那里打不开”的问题的…它就是把所有运行所需的依赖打包成一个镜像来达成这一目的的 两件事: 1⃣️ 所以你的问题是 node_modules 大,这个可以用 https://pnpm.io/motivation 瘦身一下 2⃣️ 然后你说的构建期间 npm install 慢,这个可以缓存一下 node_modules 目录,gitlab 可以配置一个变量 避免被 clean 掉 | 
|  |      22ETiV      2023-06-12 17:32:34 +08:00 via iPhone 哦对  docker image 还有个“层”的概念 你可以先把最基础、都通用的 node_modules COPY 进去,这样再 build 、和 pull 都可以避免重新同步这部分文件内容 | 
|      24n18255447846      2023-06-13 02:09:55 +08:00 npm install --registry local 建个本地源 | 
|      25n18255447846      2023-06-13 02:12:16 +08:00 或者 docker volume 挂载 node_modules 目录。没测试过多个容器能否用同一个盘,只是个想法 | 
|      26whileFalse      2023-06-13 06:05:17 +08:00 via Android @vevlins 你还是把业务需要完整的说一下比较好 | 
|  |      27zzl22100048      2023-06-13 10:07:06 +08:00 | 
|  |      28cwliang      2023-06-13 11:21:34 +08:00 可以搜一下 node.js 应用构建 image 馊身方案,比如只安装 dependencies 依赖 | 
|      29cdswyda      2023-06-13 13:41:50 +08:00 提供一个思路, 用一个 docker 做私有仓库,其他的 nodejs 镜像的 npm 安装源都指向这个,也就是所有的安装都会指向你自己的那个 docker ,所谓安装也就是一次文件拷贝。 |