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