瘦身一—合并dockerfile语句
- 每个RUN语句、COPY语句、ADD语句都会创建一个新层
- 如果是使用的是git仓库的代码,可以考虑把历史提交合并成一个
使用 &&
FROM ubuntu
RUN apt-get update && apt-get install vim
瘦身二—使用Docker多阶段构建将层合并为一
查看docker构建的历史记录:
docker history node-vanilla
使用多阶段构建
- 之前的dockerfile:
==会自动生成5层==
这个Dockerfile文件中有一个COPY和一个RUN语句。在我们的预期中,在基础镜像上应该至少有两层
FROM node:8
EXPOSE 3000
WORKDIR /app
COPY package.json index.js ./
RUN npm install
CMD ["npm", "start"]
- 改造以后的dockerfile:
==会自动生成3层==
Dockerfile的第一部分创建了三个层。接着这些层被合并复制到第二个阶段中。然后又在这个镜像之上添加了两层,最终变成三个层。
FROM node:8 as build
WORKDIR /app
COPY package.json index.js ./
RUN npm install
FROM node:8
COPY --from=build /app /
EXPOSE 3000
CMD ["index.js"]
瘦身三—使用Distroless移除容器中的所有累赘
- 目前的镜像不仅含有Node.js,还含有yarn、npm、bash以及大量其他二进制文件。同时,它是基于Ubuntu的。因此拥有一个完整的操作系统以及所有的二进制文件和实用程序
- ==Distroless镜像==只包含应用程序及其运行时依赖。不包含包管理器、Shell以及其他标准Linux发行版中能找到的其他程序。
使用Distroless
FROM node:8 as build
WORKDIR /app
COPY package.json index.js ./
RUN npm install
FROM gcr.io/distroless/nodejs
COPY --from=build /app /
EXPOSE 3000
CMD ["index.js"]
使用alpine作为更小的基础镜像
- alpine基础镜像是基于muslc的,muslc占用空间更小,以安全为核心,牺牲了速度
- ubuntu、centos、debian都是基于glibc的,速度快。相对于apline,安全比较差
FROM node:8 as build
WORKDIR /app
COPY package.json index.js ./
RUN npm install
FROM node:8-alpine
COPY --from=build /app /
EXPOSE 3000
CMD ["npm", "start"]