如何挑选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镜像的更多相关文章

  1. docker制作node程序镜像:

    准备: 需要5个文件 新建一个docker文件夹 1 .ignore git忽略文件用的 2 pakage.json 安装NODE程序的 也可以直接拷贝进 docker文件加 3 node环境 lin ...

  2. node官方docker镜像运行bower 提示 permission denied 解决方法

    在使用node官方docker镜像部署node应用时,应用需要npm的scripts中运行bower install 来安装前端包,但是用docker 构建时失败,提示 permission dein ...

  3. 使用 Docker 部署 Node 应用 - 镜像文件尺寸的优化

    前面 使用 Docker 部署 Node 应用 一文中完成了镜像的创建和运行,不过生成的镜像还有些粗糙,需要进一步优化. 镜像的优化 通过 docker images 看到简单的一个 node 服务端 ...

  4. Docker & ASP.NET Core (2):定制Docker镜像

    上一篇文章:把代码连接到容器 Dockerfile 在Docker的世界里,我们可以通过一个叫Dockerfile的文件来创建Docker镜像,随后可以运行容器. Dockerfile就是一个文本文件 ...

  5. Docker镜像仓库清理的探索之路

    用友云开发者中心是基于Docker容器进行微服务架构应用的落地与管理.相信各位同学在使用的过程中,会发现随着Docker镜像的增多,占用磁盘空间也约来越多.这时我们需要清理私有镜像仓库中不需要的镜像. ...

  6. 构建自定义docker镜像,上传至docker hub

    docker 优势 (外部参考) Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后 发布到任何流行的Linux机器上,便可以实现虚拟化.Docker改变了虚拟化的方 式,使 ...

  7. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

  8. doris 0.9.0版本docker镜像制作与使用

    1. 安装docker 详情请参见本人博客 2. 编译doris 详情请参见doris官网文档 3. 在编译好的doris output文件夹下编写两个Dockerfile 3.1  Dockerfi ...

  9. Maven Docker镜像使用技巧

    摘要: Maven是目前最流行的Java项目管理工具之一,提供了强大的包依赖管理和应用构建功能.本文以Maven为例介绍了Docker在应用构建中的一些常见技巧. Maven是目前最流行的Java项目 ...

随机推荐

  1. 【聚沙成塔系列】之《UML九种图-包图、类图》

    一.包 (一)相关概念: 1.包: 一个包=一层=一个命名空间=一个文件夹 2.包的命名: 简单名:王老二 路径名:中国.河北省.廊坊市.廊坊师范学院.信息技术提高班.九期班.王老 3.可见性: +公 ...

  2. Codility--- TapeEquilibrium

    Task description A non-empty zero-indexed array A consisting of N integers is given. Array A represe ...

  3. 关于web系统整体优化提速总结

    关于web系统整体优化提速总结 一.背景 随着公司业务的拓展,随之而来就是各种系统横向和纵向的增加,PV.UV也都随之增加,原有的系统架构和模式慢慢遇上了瓶颈,需要逐步的对系统从整体上进行改造升级,通 ...

  4. JavaScript 一元正号运算符

    本文适合JavaScript初学者. 一元正号介绍 一元正号运算符(+)位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值. 尽管一元负号也能转换非数值类型,但是一 ...

  5. 全自动Landsat影像温度反演软件开发

    许久没有更新遥感类软件开发了,都有点生疏了,这一次我带来了一个老的算法,新的东西, 为什么这么说呢,我们知道Landat8.Landsat5等影像,单个影像去做温度反演,并没有什么太大的难度, 但是呢 ...

  6. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  7. SpringBoot项目多数据源配置

    博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507

  8. vue-cli的服务代理

    vue-cli的默认端口是8080,如果我们的请求如下 我们就可以将地址改成

  9. 并发编程-concurrent指南-ReadWriteLock-ReentrantReadWriteLock(可重入读写锁)

    几个线程都申请读锁,都能获取: import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantRea ...

  10. cocopods新建或者更新远端库主要操作步骤

    1.搭建远程仓库(私有或者公有项目): 2.使用sourceTree拉去远程仓库: 3.打开拉去的项目仓库Finder,构建pod lib项目:pod lib create AFNetworking( ...