如何挑选node docker镜像
如何挑选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挺好。
如何挑选node docker镜像的更多相关文章
- docker制作node程序镜像:
准备: 需要5个文件 新建一个docker文件夹 1 .ignore git忽略文件用的 2 pakage.json 安装NODE程序的 也可以直接拷贝进 docker文件加 3 node环境 lin ...
- node官方docker镜像运行bower 提示 permission denied 解决方法
在使用node官方docker镜像部署node应用时,应用需要npm的scripts中运行bower install 来安装前端包,但是用docker 构建时失败,提示 permission dein ...
- 使用 Docker 部署 Node 应用 - 镜像文件尺寸的优化
前面 使用 Docker 部署 Node 应用 一文中完成了镜像的创建和运行,不过生成的镜像还有些粗糙,需要进一步优化. 镜像的优化 通过 docker images 看到简单的一个 node 服务端 ...
- Docker & ASP.NET Core (2):定制Docker镜像
上一篇文章:把代码连接到容器 Dockerfile 在Docker的世界里,我们可以通过一个叫Dockerfile的文件来创建Docker镜像,随后可以运行容器. Dockerfile就是一个文本文件 ...
- Docker镜像仓库清理的探索之路
用友云开发者中心是基于Docker容器进行微服务架构应用的落地与管理.相信各位同学在使用的过程中,会发现随着Docker镜像的增多,占用磁盘空间也约来越多.这时我们需要清理私有镜像仓库中不需要的镜像. ...
- 构建自定义docker镜像,上传至docker hub
docker 优势 (外部参考) Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后 发布到任何流行的Linux机器上,便可以实现虚拟化.Docker改变了虚拟化的方 式,使 ...
- 使用Jenkins pipeline流水线构建docker镜像和发布
新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...
- doris 0.9.0版本docker镜像制作与使用
1. 安装docker 详情请参见本人博客 2. 编译doris 详情请参见doris官网文档 3. 在编译好的doris output文件夹下编写两个Dockerfile 3.1 Dockerfi ...
- Maven Docker镜像使用技巧
摘要: Maven是目前最流行的Java项目管理工具之一,提供了强大的包依赖管理和应用构建功能.本文以Maven为例介绍了Docker在应用构建中的一些常见技巧. Maven是目前最流行的Java项目 ...
随机推荐
- 20 个免费开源的 CSS3 用户界面工具包
ui.css Metro UI CSS Pure CSS jQuery jKit Solid HTML5/CSS3 UI Kit CSS3 UI Kit Alt CSS3 UI Kit MediaLo ...
- QTableView中加入Check列实现,无需Delegate(使用::data(),Qt原生支持)
通过Delegate创建QCheckBox来实现的Check列,只有在该列进入编辑模式时才能够Check/Uncheck.这显然不是我们想要的,网上翻来翻去,在一个国外论坛中看到了无需Delegate ...
- 《linux内核设计与实现》阅读笔记-进程与调度
一.进程 process: executing program code(text section) data section containing global variables open f ...
- 先订一个小目标,把微信小程序搞懂
目标:系统性学习微信小程序. 第一阶段:熟悉微信小程序及前端开发(结合web前端学习) 第二阶段:了解设计及后端 第三阶段:学习后端.
- Java学习笔记-spring整合mybatis
这个项目就是一个例子,只有添加图书的功能: 项目架构: resource: 整合流程: 1.pom文件节点,这两个是整合用的,其他节点不再赘述: <!-- https://mvnreposito ...
- MyBatis无限级分类实现的两种方法--自关联与map集合
1.这回先创建数据库吧 下表cid是CategoryId的缩写,cname是CategoryName的缩写,pid是parentId的缩写 无限级分类一般都包含这三个属性,至少也要包含cid和pid才 ...
- TCP/IP 第四、五章
1, 2, 整个arp请求的过程. 3,arp -a 获取arp高速缓存.一般arp高速缓存存活时间20分钟,不完整的表项设置为3分钟.因为机器的ip地址可能发生改变. 4, 5,arp一般是操作系统 ...
- 【HDU - 2612】Find a way
-->Find a way 直接上Chinese Descriptions: hsj和lsh最近迷上了pokemon go的游戏.在双十一大物期中考试来临之前,他们想抓一只稀有土拨鼠来攒攒人品 ...
- 安装win7和linux [ubuntu14]双系统
想体验一把ubuntu18.10最新桌面版的快感,但是windows上面的数据又删除不得,所以百度了一下,win7和linux双系统的安装教程. 一.首先在win7上创建新的分区 https://ji ...
- ES6_09_Generator函数
Generator函数: 概念: 1.ES6提供的解决异步编程的方案之一 2.Generator函数是一个状态机,内部封装了不同状态的数据, 3.用来生成遍历器对象 4.可暂停函数(惰性求值), yi ...