Docker Build:基于alpine 3.7 编译Node 10.2.0最小镜像
动机
最近看到node.js已经发布到10.2,然而alpine中迟迟没有提供10.2版本的node.js,截止当前时间,alpine 3.7中最新node.js版本为8.11.2,索性花了点时间折腾一个。
最终上传到阿里容器云之后的效果
编译完成之后大约106m大小。
先启动一个alpine:3.7容器
docker run -dit --name alpine alpine:3.7
docker exec -it alpine sh
执行了上面2行shell脚本之后,就开启并进入了一个alpine 3.7容器环境,然后可以准备编译环境了
安装必备环境
apk --update add linux-headers
apk --update add python
apk --update add g++
apk --update add make
准备下载源代码
cd /root/
wget https://npm.taobao.org/mirrors/node/v10.2.0/node-v10.2.0.tar.gz
tar xvf node-v10.2.0.tar.gz
cd node-v10.2.0
开始编译
./configure && make
接下来是漫长的等待,当出现如下图的时候,编译成功
提取需要的文件
- node --> ./out/Release
- npm --> ./deps/npm
现在需要将容器中的文件拿出来,可以在容器外面使用docker cp来实现 docker cp <containerId>:/file/path/within/container /host/path/target
例如:
docker cp alpine:/root/node-v10.2.0/out/Release/node /home/xxxx/node
编译前的准备工作
将所有用到的文件跟Dockerfile文件放在同一个层级,如下图所示
接下来编写Dockerfile文件
Dockerfile
光有node执行程序其实还不够,还需要安装一些依赖库,具体的在dockerfile文件中体现,Dockerfile文件内容如下所示
FROM alpine:3.7
COPY ./node-10.2.0/node /usr/bin/
COPY ./node-10.2.0/npm /root/npm
COPY ./run /root/
COPY ./init /root/
RUN apk --update add git && \
apk --update add curl && \
apk --update add c-ares && \
apk --update add ca-certificates && \
apk --update add http-parser && \
apk --update add libcrypto1.0 && \
apk --update add libgcc && \
apk --update add libssl1.0 && \
apk --update add libstdc++ && \
apk --update add libuv && \
apk --update add musl && \
apk --update add zlib
RUN cd /root &&\
mkdir /usr/lib/node_modules &&\
mv npm /usr/lib/node_modules/ &&\
ln -s /usr/lib/node_modules/npm/bin/npx-cli.js /usr/bin/npx &&\
ln -s /usr/lib/node_modules/npm/bin/npm-cli.js /usr/bin/npm
RUN cd /root &&\
chmod +x run &&\
sh init
CMD /bin/sh
开始编译镜像
docker build -t node_alpine:10.2.0 -f Dockerfile-alpine-3.7 .