面试之Docker如何打出最小的镜像
面试的时候被问到:如何才能让 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