在使用 Jenkins 构建前端项目的时候遇到一点问题: node 的版本问题.
由于可能编译的项目历史不同, 所依赖的 node 版本也各有千秋, 直接把所有项目都升级到最新的也不合理. 所以必须针对不同的项目使用不同 node 构建环境.
想过 nvm, 但 nvm 是系统级别的环境变量切换, 会导致同时运行的其他 job 也会使用 nvm 更改后的 node 版本. nvm 只适合个人开发使用.
想过下载. 最初见到公司的仓库里会有 node.gradle 脚本, 主要用来下载当前项目的 node, 然后直接用自己下载的 node 来构建. 用起来还行, 但脚本维护是一个问题, 升级是一个问题, 下载也是一个问题.
最终选择用 docker 来构建. docker 可以随意挑选 node 镜像, 可以缓存. 我们可以基于官方的镜像, 添加一些适合自己的依赖, 比如缓存一些公共的 module.
docker hub 里有多个 node tag, 选择哪个好呢.
google 了一下, 大概得出的结论是: alpine 足矣. 但我最终没有选择 alpine, 后面说原因.
Node Docker tag
先来看看 node 官方的 docker 镜像有哪些版本.
node:<version>
基于 Debian, 官方默认镜像. 当你不确定你需要什么的时候选择这个就对了. 这个被设计成可以丢弃的镜像, 也就是可以用作构建源码使用. 体积挺大.
node:<version>-slim
基于 Debian, 删除了很多默认公共的软件包, 只有 node 运行的最小环境. 除非你有空间限制, 否则推荐使用默认镜像.
node:<version>-alpine
基于 alpine, 比 Debian 小的多. 如果想要最小的镜像, 可以选择这个做为 base. 需要注意的是, alpine 使用 musl 代替 glibc. 一些 c 环境的软件可能不兼容. 但大部分没问题.
选择
按照版本推荐. 对比我们的需求, 作为构建环境的化, 应该选择默认镜像.
来对比下所谓的镜像体积:
- node 12.6.0-buster-slim e6e2b19326d7 13 hours ago 161MB
- node 12.6.0-buster b6a436219112 13 hours ago 875MB
- node 12.6.0-alpine a9a8b83644f7 3 weeks ago 78.8MB
在这之前先来了解下 debian 的发行版
Debian 10(buster) - 当前的稳定版 (stable)
Debian 9(stretch) - 旧的稳定版 (oldstable)
Debian 8(jessie) - 更旧的稳定版 (oldoldstable)
Debian 7(wheezy) - 被淘汰的稳定版
最新的 node 镜像就是基于 Debian 10 buster 构建的.
image 的体积上, alpine 几乎比默认镜像小 10 倍. 即便缩减后的 slim, 也少一半.
再来看 image 体积重要不重要. 大的 image 下载需要花时间, 需要占用磁盘空间. 思考一下, 官方镜像近 1g, 这个磁盘空间还是有的. 至于下载时间, docker 分层缓存机制可以使得我们只要下载一次即可. 也是可以接受.
在使用镜像的时候, docker 对于共享的分层是不会复制两份的, 也就是共享一份, 不会增大磁盘空间. 详细介绍见理解 docker 镜像分层
关注下运行时的内存占用
- sudo docker stats
- CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
- c0affeebef3f gracious_williamson 0.00% 964KiB / 15.54GiB 0.01% 8.23kB / 0B 0B / 0B 1
- c7a52376ac30 suspicious_goldstine 0.00% 2.047MiB / 15.54GiB 0.01% 9.57kB / 0B 4.13MB / 0B 1
- 39ae2195606d unruffled_elgamal 0.00% 1.387MiB / 15.54GiB 0.01% 12.2kB / 0B 0B / 0B 1
差别还是有的, 但在可以接受的范围内.
最重要的是, 不同 tag 的 docker 镜像运行时可以满足需求吗.
针对这三种镜像, 分别对 vue-element-admin 执行了 NPM install. 结果基于 debian 的镜像 12.6.0-buster-slim 和 12.6.0-buster 都 ok, 但 12.6.0-alpine 报错了
所以呢, 针对我当前作为构建环境的需求, 选择 12.6.0-buster, 也没啥.
至于 Node.JS 运行时的 server, 没有实验, 感觉 12.6.0-buster-slim 挺好.
来源: https://www.cnblogs.com/woshimrf/p/node-docker-image.html