当前位置: 首页 > 后端技术 > Node.js

Nodejs打造最小docker镜像

时间:2023-04-04 00:10:54 Node.js

使用docker运行服务,可以拥有一致的环境,可以精确控制服务的运行资源(cpu,内存),可以轻松设置端口和网络,可以使用镜像仓库来管理和分发代码。现在越来越多的开发者选择在docker上运行服务。很多nodejs用户在使用docker时直接使用默认的node镜像。但是你不觉得它太大了吗?现在node:6.10.1镜像的大小已经达到了666M。其实要实现同样的功能,只需要43.5M就够了。小尺寸意味着更低的资源消耗、更快的下载速度和更小的传输带宽。下面将介绍如何创建一个最小节点图像。FROM:设置alpine基础镜像目前docker下最轻的操作系统是alpine,一个alpine的体积不到5M。node默认镜像依赖的baseimage是debian,debian:jessie的大小已经达到了123M,所以如果想减小体积,首先是从baseimage切换到alpine。FROMalpine:3.5RUN:Setnodeuseradduser-D-u1000node设置节点用户是可选的。添加用户并运行容器后,可以指定节点用户身份运行服务RUN:安装节点编译工具apkadd--no-cache\libstdc++\&&apkadd--no-cache--virtual.build-deps\binutils-gold\curl\g++\gcc\gnupg\libgcc\linux-headers\make\pythonapkadd--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";\doneThesepublickeyswillbeusedtoverifythenodejssourcecodefilewedownloadedthroughcurlRUN:Downloadandnodeverifythesourcecodefilecurl-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:Referstothenodeversion,suchas6.10.1RUN:compileandinstallnodetar-xf"node-v$NODE_VERSION.tar.xz"\&&a议员;cd"node-v$NODE_VERSION"\&&./configure\&&make-j$(getconf_NPROCESSORS_ONLN)\&&makeinstall如果不需要npm,可以把第三行换成&&./configure--without-npm$NODE_VERSION:指节点版本,比如6.10.1RUN:Cleanupapkdel.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.1CMD:设置镜像入口为nodeCMD["node"]以上步骤是创建nodejs镜像所必需的,下面的步骤添加安装yarn安装依赖apkadd--no-cache--virtual.build-deps-yarncurlgnupgimportpublickeyforkeyin\6A010C5166006599AA17F08146C2130DFD2497F5\;做\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.22installmvyarn.js/usr/local/bin/yarn\&&chmod+x/usr/local/bin/yarn\cleanapkdel.build-deps-yarnc++plugin如果要支持c++插件,需要安装python,make,g++apkadd--no-cachepythonmakeg++headersfile部分c++模块在使用过程中需要下载node-headers文件,国内node-headers文件下载不稳定,建议集成到镜像中,否则可能会遇到一个包很久没有编译的情况。参考nodejs源码下载验证步骤,下载并验证headers文件。curl-SLO"https://nodejs.org/dist/v$NODE_VERSION/node-v${NODE_VERSION}-headers.tar.xz"安装头文件mkdir/root/.node-gyptar--strip-component1-xzfnode-v${NODE_VERSION}-headers.tar.xz/root/.node-gyp/$NODE_VERSIONrm-rfnode-v${NODE_VERSION}-headers.tar.xz$NODE_VERSION:指节点版本,如6.10.1结语创建一个最小的docker镜像很简单也很有意义更多文章目录在这里