资讯专栏INFORMATION COLUMN

nodejs之创建最小docker镜像

lifesimple / 1064人阅读

摘要:下面将介绍如何创建极简镜像。设置基础镜像目前下最轻量的操作系统是一个的体积不到。参考源码下载校验步骤对文件进行下载校验安装文件指版本如结论创建最小镜像是很简单且很有意义的更多文章的目录在这里

使用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。

FROM alpine:3.5
RUN: 设置node用户
adduser -D -u 1000 node 

设置node用户是可选的。添加用户后在运行容器是可以指定已node用户的身份运行服务

RUN: 安装node编译工具
apk add --no-cache 
    libstdc++ 
&& apk add --no-cache --virtual .build-deps 
    binutils-gold 
    curl 
    g++ 
    gcc 
    gnupg 
    libgcc 
    linux-headers 
    make 
    python 

apk add --no-cache不使用本地缓存安装包数据库,直接从远程获取安装包信息安装。这样我们就不必通过apk update获取安装包数据库了

apk add --virtual .build-deps将本次安装的所有包封装成一个名为.build-deps的虚拟包。这样做的好处是可以通过apk del .build-deps一键清除这些包

RUN: 导入node源码包公钥
for key in 
    9554F04D7259F04124DE6B476D5A82AC7E37093B 
    94AE36675C464D64BAFA68DD7434390BDBE9B9C5 
    FD3A5288F042B6850C66B31F09FE44734EB7990E 
    71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 
    DD8F2338BAE7501E3DD5AC78C273792F7D83545D 
    B9AE9905FFD7803F25714661B63B535A4C206CA9 
    C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 
    56730D5401028683275BD23C23EFEFE93C4CFFFE 
; do 
gpg --keyserver ha.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 --output SHASUMS256.txt SHASUMS256.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) 
&& make install 

如果不需要npm, 可以替换第三行为&& ./configure --without-npm

$NODE_VERSION: 指node版本,如6.10.1

RUN: 清理
apk del .build-deps 
&& cd .. 
&& rm -Rf "node-v$NODE_VERSION" 
&& rm "node-v$NODE_VERSION.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt

$NODE_VERSION: 指node版本,如6.10.1

CMD: 设置镜像入口为node
CMD [ "node" ]

上面为创建nodejs镜像必须步骤,下面的步骤根据需要添加

安装yarn

安装依赖

apk add --no-cache --virtual .build-deps-yarn curl gnupg

导入公钥

for key in 
6A010C5166006599AA17F08146C2130DFD2497F5 
; do 
  gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; 
done

下载校验

 curl -fSL -o yarn.js "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-legacy-$YARN_VERSION.js" 
 && curl -fSL -o yarn.js.asc "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-legacy-$YARN_VERSION.js.asc" 
 && gpg --batch --verify yarn.js.asc yarn.js 
 && rm yarn.js.asc

$YARN_VERSION: 指yarn版本,如0.22

安装

mv yarn.js /usr/local/bin/yarn 
&& chmod +x /usr/local/bin/yarn 

清理

apk del .build-deps-yarn

c++插件

如果要支持c++插件,还需安装python,make,g++

apk add --no-cache python make g++
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-component 1 -xzf node-v${NODE_VERSION}-heraders.tar.xz /root/.node-gyp/$NODE_VERSION
rm -rf node-v${NODE_VERSION}-headers.tar.xz

$NODE_VERSION: 指node版本,如6.10.1

结论

创建最小docker镜像是很简单且很有意义的

更多文章的目录在这里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26877.html

相关文章

  • Node.js docker 镜像体积优化实践

    摘要:接下来我们将逐步的减少这个镜像的体积。优化生产环境镜像使用镜像大幅减小镜像体积的最简单和最快的方法是选择一个小得多的基本镜像。使用多阶段构建可以充分利用镜像的缓存,大大减少最终部署到生产环境的时间。 关注作者github每日一道面试题详解 你讨厌部署你的应用程序花费很长时间吗? 对于单个容器来说,超过gb并不是最佳实践。每次部署新版本时都要处理数十亿字节,这对我们来说并不太合适。 本文...

    wenhai.he 评论0 收藏0
  • Docker 上开发 nodejs

    摘要:中每一条指令都创建镜像的一层,例如编写完成后可以使用来生成镜像。注意一个镜像不能超过层完成一次镜像的下载修改和上传以镜像为基础下载基础镜像编写创建新的镜像打上的运行一个容器实例上传镜像如果没有登录请登陆,使用命令 参考 https://yeasy.gitbooks.io/doc... Docker介绍 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司...

    gekylin 评论0 收藏0
  • 自建 Laravel 的 Docker 开发环境

    摘要:好久没写东西,今天说一说怎么自建一个运行的环境。注该镜像是由社区联合又拍云与优帆远扬共同合作推出的公益项目,旨在为广大用户提供稳定和高速的国内镜像服务。通过自建开发环境过程中,也能让自己学到更多。接下来还会不断完善,最小化满足开发需要。 showImg(https://segmentfault.com/img/remote/1460000015722901); 好久没写东西,今天说一说...

    Yujiaao 评论0 收藏0
  • 自建 Laravel 的 Docker 开发环境

    摘要:好久没写东西,今天说一说怎么自建一个运行的环境。注该镜像是由社区联合又拍云与优帆远扬共同合作推出的公益项目,旨在为广大用户提供稳定和高速的国内镜像服务。通过自建开发环境过程中,也能让自己学到更多。接下来还会不断完善,最小化满足开发需要。 showImg(https://segmentfault.com/img/remote/1460000015722901); 好久没写东西,今天说一说...

    yanbingyun1990 评论0 收藏0
  • 怎样构建一个好的 Docker 镜像

    摘要:在第三种情况下,我建议在另外一个镜像安装构建工具,基于最小的镜像。做这个的一个简单方式是指定包的版本,当通过包管理器更新的时候。这里有一个怎样做的示例我们所能希望的是,但是这是没有保障的,包仓库从现在开始的一年仍然会是这个版本。 本文的原文地址是 What constitutes a good docker image? 注:本文不会全部翻译,只会挑选个人认为有价值的部...

    kk_miles 评论0 收藏0

发表评论

0条评论

lifesimple

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<