如何挑选node docker镜像

在使用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,也没啥。

至于nodejs运行时的server,没有实验,感觉12.6.0-buster-slim挺好。

最新文章

  1. php时间
  2. Servlet基础
  3. MySQL substring:字符串截取 (转载)
  4. Xcode配置.pch文件
  5. asp.net mvc 后台怎么接受前端返回的array list dictionary
  6. [C.Sharp] Color 颜色转换
  7. Storm实战常见问题及解决方案
  8. u-boot代码学习内容
  9. Mongodb 之insert瞬时完成,测试数据---飞天博客
  10. TinyMCE实现简单的本地上传
  11. JS中获取session中传过来的值对象
  12. Linux基本命令总结(六)
  13. sqlmap基础入门超详细教程
  14. renameTo()判断文件是否被占用(判断大文件是否完成拷贝这个动作)
  15. Go语言学习笔记(三) [控制结构、内建函数]
  16. Centos 6\7下yum安装rstudio-server\shiny-server
  17. 原生js--类、原型、构造函数
  18. UVa 140 带宽
  19. python学习笔记09-python编码与解码
  20. LeetCode 80. 删除排序数组中的重复项 II

热门文章

  1. Wp8 Popup不随输入法偏移问题解决方案
  2. 关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题
  3. 利用POi3.8导出excel产生大量xml临时文件怎么办?
  4. spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)
  5. meta 详解
  6. 如何判断/检查一个集合(List&lt;string&gt;)中是否有重复的元素
  7. BZOJ 3990 排序
  8. 为什么wepy的数据无法渲染到实例里面去
  9. 驰骋工作流引擎-CCMobile与安卓、IOS集成过程中的问题与解决方案
  10. 关于ffmpeg /iis 8.5 服务器下,视频截取第一帧参数配置