面试的时候被问到:如何才能让 docker 打出的镜像包尽量小?
其实在生产已经尽量使用最小化的镜像包了,只是突然被问到还是有点懵圈;因为印象中自己基本是使用 alphine 做底包,Dockerfile 通常就是 copy 一个可执行的程序进去就完事了,如果不行,再开 shell 进去慢慢添加缺少的库文件。
这里就总结一下,两点:
一、使用尽量小的底包
以 alphine 为主,使用 alphine 底包的时候,需要注意以下:
1、替换 apk 的源
2、更新、更新证书
3、注意 Timezone 的设置
4、注意 glibc 库的兼容问题
二、使用分阶段build
通常类似c、go、rust之类的源代码,都需要经过编译,最后产生可执行文件,那么完整的编译环境其实对最后的镜像来说都是不需要的。
所以利用分阶段build,甩脱编译环境以及中间产物,就可以缩小最后 build 出镜像的大小,使用也很简单。
Dockerfile 文件内容如下:
1FROM golang:alpine AS build-env
2WORKDIR /app
3ADD . /app
4RUN cd /app && go build -o goapp
5
6
7FROM alpine
8RUN apk update && \
9 apk add ca-certificates && \
10 update-ca-certificates && \
11 rm -rf /var/cache/apk/*
12WORKDIR /app
13COPY --from=build-env /app/goapp /app
14EXPOSE 8080
15ENTRYPOINT ./goapp