详解nodejs之创建最小docker镜像
使用docker运行服务,你可以拥有一致的环境,可以精确控制服务的运行资源(cpu,内存),可以方便的设置端口和网络,可以使用镜像仓储管理和分发代码。现在越来越多的开发者选择将服务运行在docker上。
好多nodejs用户在使用docker时,直接使用了默认的node镜像。但你不觉得它太大了吗?现在node:6.10.1镜像的体积已经达到666M,其实要实现同样的功能,只需43.5M就够了。尺寸小,意味者更低的资源消耗,更快的下载速度,更小的传输带宽。下面将介绍如何创建极简node镜像。
FROM:设置alpine基础镜像
目前docker下最轻量的操作系统是alpine,一个alpine的体积不到5M。node默认镜像依赖的基础镜像是debian,debian:jessie体积已打123M,所以想减小尺寸,首要就是从基础镜像切换到alpine。
FROMalpine:3.5
RUN:设置node用户
adduser-D-u1000node
设置node用户是可选的。添加用户后在运行容器是可以指定已node用户的身份运行服务
RUN:安装node编译工具
apkadd--no-cache\ libstdc++\ &&apkadd--no-cache--virtual.build-deps\ binutils-gold\ curl\ g++\ gcc\ gnupg\ libgcc\ linux-headers\ make\ python
- apkadd--no-cache不使用本地缓存安装包数据库,直接从远程获取安装包信息安装。这样我们就不必通过apkupdate获取安装包数据库了
- apkadd--virtual.build-deps将本次安装的所有包封装成一个名为.build-deps的虚拟包。这样做的好处是可以通过apkdel.build-deps一键清除这些包
RUN:导入node源码包公钥
forkeyin\ 9554F04D7259F04124DE6B476D5A82AC7E37093B\ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5\ FD3A5288F042B6850C66B31F09FE44734EB7990E\ 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1\ DD8F2338BAE7501E3DD5AC78C273792F7D83545D\ B9AE9905FFD7803F25714661B63B535A4C206CA9\ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8\ 56730D5401028683275BD23C23EFEFE93C4CFFFE\ ;do\ gpg--keyserverha.pool.sks-keyservers.net--recv-keys"$key";\ done
这些公钥将用来校验我们通过curl下载的nodejs源码文件
RUN:下载并node校验源码文件
curl-SLO"https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION.tar.xz"\ &&curl-SLO"https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"\ &&gpg--batch--decrypt--outputSHASUMS256.txtSHASUMS256.txt.asc\ &&grep"node-v$NODE_VERSION.tar.xz\$"SHASUMS256.txt|sha256sum-c-
$NODE_VERSION:指node版本,如6.10.1
RUN:编译安装node
tar-xf"node-v$NODE_VERSION.tar.xz"\ &&cd"node-v$NODE_VERSION"\ &&./configure\ &&make-j$(getconf_NPROCESSORS_ONLN)\ &&makeinstall
- 如果不需要npm,可以替换第三行为&&./configure--without-npm
- $NODE_VERSION:指node版本,如6.10.1
RUN:清理
apkdel.build-deps\ &&cd..\ &&rm-Rf"node-v$NODE_VERSION"\ &&rm"node-v$NODE_VERSION.tar.xz"SHASUMS256.txt.ascSHASUMS256.txt
$NODE_VERSION:指node版本,如6.10.1
CMD:设置镜像入口为node
CMD["node"]
上面为创建nodejs镜像必须步骤,下面的步骤根据需要添加
安装yarn
安装依赖
apkadd--no-cache--virtual.build-deps-yarncurlgnupg
导入公钥
forkeyin\ 6A010C5166006599AA17F08146C2130DFD2497F5\ ;do\ gpg--keyserverha.pool.sks-keyservers.net--recv-keys"$key";\ done
下载校验
curl-fSL-oyarn.js"https://yarnpkg.com/downloads/$YARN_VERSION/yarn-legacy-$YARN_VERSION.js"\ &&curl-fSL-oyarn.js.asc"https://yarnpkg.com/downloads/$YARN_VERSION/yarn-legacy-$YARN_VERSION.js.asc"\ &&gpg--batch--verifyyarn.js.ascyarn.js\ &&rmyarn.js.asc
$YARN_VERSION:指yarn版本,如0.22
安装
mvyarn.js/usr/local/bin/yarn\ &&chmod+x/usr/local/bin/yarn\
清理
apkdel.build-deps-yarn
c++插件
如果要支持c++插件,还需安装python,make,g++
apkadd--no-cachepythonmakeg++
headers文件
有些c++模块使用过程中还需要下载node-headers文件,node-headers文件国内下载不稳定,建议也集成到镜像里,否则你可能碰到一个包编译很久没动静的情况。
参考nodejs源码下载校验步骤对headers文件进行下载校验
curl-SLO"https://nodejs.org/dist/v$NODE_VERSION/node-v${NODE_VERSION}-headers.tar.xz"
安装headers文件
mkdir/root/.node-gyp tar--strip-component1-xzfnode-v${NODE_VERSION}-heraders.tar.xz/root/.node-gyp/$NODE_VERSION rm-rfnode-v${NODE_VERSION}-headers.tar.xz
$NODE_VERSION:指node版本,如6.10.1
结论
创建最小docker镜像是很简单且很有意义的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。