压缩 Docker 镜像大小的一些技巧

查看原文

本文介绍了一些减小 Docker Image 大小的技巧。更小的镜像,部署可以更快。镜像变大很大一个原因是每添加一个 RUN/ COPY / ADD 到 Dockerfile 中,构建后就会增加新的一个 Layer。这些层存储着前后版本之间的信息。在之前 Docker 特性还不够多的时候,唯一的办法是压缩到仅剩一个 RUN,在 RUN 中的命令用 && 来拼接运行。现在,最适合这个场景的技巧叫 multi-stage build。通过多次写 FROM,可以将基于上一次的 BASE Image 构建出来的东西,复制到下一次 BASE Image 去,复制的过程中会合并成仅剩一个 Layer。举例:

FROM node:8 as build
WORKDIR /app
COPY package.json index.js ./
RUN npm install
FROM node:8
COPY --from=build /app /

第二步,是移除掉构建相关的工具,例如将上面的 FROM node:8 替换成 FROM gcr.io/distroless/nodejs 可以去掉诸如 npm, yarn 等工具,反正生产环境也不需要这些东西。唯一的缺点就是真正要 Inspect 的时候会有点不太方便,可能连个 bash,vim 都没有。相对的,黑客也入侵进去也没法修改,最多掐掉进程。

或者使用 FROM node:8-alpine 这些基于 alpine 的镜像做 multi-stage build。需要注意的是,如果应用有 C 依赖,需要测试兼容性,因为 alpine 选用 muslc 作为 libc。