面试之Docker如何打出最小的镜像

面试的时候被问到:如何才能让 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
16
17

面试之Nginx的epoll的优势
Javascripts之数组的reduce
comments powered by Disqus