背景
在私有化專案中,我司現場實施基本上是使用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。
最後
如有不足之處歡迎指出