背景
在私有化项目中,我司现场实施基本上是使用docker部署。而过大的镜像体积会影响实施部署效率(xinqing),所以作为开发要想与实施和谐相处(bubeipeng),可以优化一下镜像体积。
具体方法
1.减少dockerfile中的指令。如有多个RUN指令,可以用&&符号连接。 使用
RUN apt-get update && apt-get install gettext
而不是
RUN apt-get update
RUN apt-get install gettext
2.使用多阶段构建
FROM node:8.9.4 as build
ADD ./im-manage ./data/dev/im-manage/
ADD ./entrypoint.d ./data/dev/im-manage/entrypoint.d
RUN npm install
FROM node:8.9.4-alpine
RUN apk add --no-cache gettext
WORKDIR /data/dev/im-manage
COPY --from=build /data/dev/im-manage .
3.使用Alpine版本的基础镜像
比如node:8.9.4-alpine
目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。相比于其他 Docker 镜像,它的容量非常小,仅仅只有5MB左右。注意alpine自带的包管理工具是apk。
原理
docker镜像制作是一层一层构建的,一条语句就会创建一个新层。而层数是会占用体积的,显而易见层数越多,体积越大。所以第一种方法减少语句即会减小镜像体积。 在第二种方法的示例中,docker多阶段构建将构建过程分为两个阶段。对于第二个阶段来说
FROM node:8.9.4 as build
ADD ./im-manage ./data/dev/im-manage/
ADD ./entrypoint.d ./data/dev/im-manage/entrypoint.d
RUN npm install
这四层会被压缩成一层。然后在下一阶段通过COPY --form=build引入,所以最终是四层。这有点类似git当中,将多个提交点合并为一个提交点。
实践
优化之前的Dockerfile
FROM node:8.9.4
WORKDIR /data/dev/im-manage
RUN apt-get update
RUN apt-get gettext
ADD ./im-manage ./
ADD ./entrypoint.d ./entrypoint.d
RUN npm install
优化之后的Dockerfile
FROM node:8.9.4 as build
ADD ./im-manage ./data/dev/im-manage/
ADD ./entrypoint.d ./data/dev/im-manage/entrypoint.d
RUN npm install
FROM node:8.9.4-alpine
RUN apk add --no-cache gettext
WORKDIR /data/dev/im-manage
COPY --from=build /data/dev/im-manage .
体积从1G多减小到了350+;少了将近1个G。

最后
如有不足之处欢迎指出