docker映象體積優化方法與實踐

陳續淵發表於2019-01-03

背景

在私有化專案中,我司現場實施基本上是使用docker部署。而過大的映象體積會影響實施部署效率(xinqing),所以作為開發要想與實施和諧相處(bubeipeng),可以優化一下映象體積。

具體方法

1.減少dockerfile中的指令。如有多個RUN指令,可以用&&符號連線。 使用

RUN apt-get update && apt-get install gettext
複製程式碼

而不是

RUN apt-get update
RUN apt-get install gettext
複製程式碼

2.使用多階段構建

FROM node:8.9.4 as build
ADD ./im-manage ./data/dev/im-manage/
ADD ./entrypoint.d ./data/dev/im-manage/entrypoint.d
RUN npm install

FROM node:8.9.4-alpine
RUN apk add --no-cache gettext
WORKDIR /data/dev/im-manage
COPY --from=build /data/dev/im-manage .
複製程式碼

3.使用Alpine版本的基礎映象 比如node:8.9.4-alpine 目前 Docker 官方已開始推薦使用 Alpine 替代之前的 Ubuntu 做為基礎映象環境。相比於其他 Docker 映象,它的容量非常小,僅僅只有5MB左右。注意alpine自帶的包管理工具是apk。

原理

docker映象製作是一層一層構建的,一條語句就會建立一個新層。而層數是會佔用體積的,顯而易見層數越多,體積越大。所以第一種方法減少語句即會減小映象體積。 在第二種方法的示例中,docker多階段構建將構建過程分為兩個階段。對於第二個階段來說

FROM node:8.9.4 as build
ADD ./im-manage ./data/dev/im-manage/
ADD ./entrypoint.d ./data/dev/im-manage/entrypoint.d
RUN npm install
複製程式碼

這四層會被壓縮成一層。然後在下一階段通過COPY --form=build引入,所以最終是四層。這有點類似git當中,將多個提交點合併為一個提交點。

實踐

優化之前的Dockerfile

FROM node:8.9.4

WORKDIR /data/dev/im-manage

RUN apt-get update
RUN apt-get gettext

ADD ./im-manage ./
ADD ./entrypoint.d ./entrypoint.d
RUN npm install
複製程式碼

優化之後的Dockerfile

FROM node:8.9.4 as build
ADD ./im-manage ./data/dev/im-manage/
ADD ./entrypoint.d ./data/dev/im-manage/entrypoint.d
RUN npm install

FROM node:8.9.4-alpine
RUN apk add --no-cache gettext
WORKDIR /data/dev/im-manage
COPY --from=build /data/dev/im-manage .
複製程式碼

體積從1G多減小到了350+;少了將近1個G。

docker映象體積優化方法與實踐

最後

如有不足之處歡迎指出

相關文章