iT邦幫忙

2022 iThome 鐵人賽

DAY 26
1
DevOps

從零開始的Kubernetes轉換系列 第 26

Day 26 Dockerfile Refine python篇

  • 分享至 

  • xImage
  •  

搬上cloud後,免不了的都要幫本來團隊中的docker做一些瘦身的動作。
今天來拿一個python的例子解釋,我們如何來進行瘦身。

我們先來看一個例子

FROM python:3.8.12-slim-buster as base
WORKDIR /
RUN apt-get update && \
    apt-get install -y apt-utils && \
    apt-get install -y procps && \
    apt-get install -y gcc && \
    apt-get install -y --no-install-recommends vim && \
    apt-get install -y htop && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean

RUN pip install --upgrade pip
RUN pip install pipenv

ADD Pipfile.lock .
ADD Pipfile .
RUN pipenv sync --system
ADD src ctr_modeling/src
ADD temp/test_data.pkl ctr_modeling/temp/test_data.pkl
ADD model ctr_modeling/model

CMD ["python3", "ctr_modeling/src/modeling_process.py"]

這樣build完的size大約會在


aaa                                             latest    24e45968b3c0   About a minute ago   2.25GB

首先呢這樣的一個Dockerfile會為了pip有可能要build東西裝了些gcc的套件,另外也會多裝了一些python的bin,我們可以透過一些multustaging的手段來解決
像下面這個改動。

FROM python:3.8.12-slim-buster as base
WORKDIR /

ENV PYROOT /pyroot
ENV PYTHONUSERBASE $PYROOT

FROM base as builder

RUN apt-get update  && \
    apt-get install -y apt-utils build-essential && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean

RUN pip install --upgrade pip
RUN pip install pipenv

ADD Pipfile .
#ADD Pipfile.lock .

RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv clean
RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv sync --system
#RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv install --system

FROM base
COPY --from=builder $PYROOT/lib/ $PYROOT/lib/

RUN apt-get update && \
    apt-get install -y apt-utils \
                         procps \
                         net-tools && \
    apt-get install -y --no-install-recommends vim &&\
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean

RUN pip install --ignore-installed six

ADD src ctr_modeling/src

CMD ["python3", "ctr_modeling/src/modeling_process.py"]

特別注意COPY --from=builder這一行
我們把前一個builder stage的$PYROOT/lib中的套件拉過來
那我們用上面的方法build 大概size會到多少呢?

bbb                                             latest    f50100479b20   19 seconds ago   1.25GB

馬上從2.25 GB 瘦身到 1.25 GB

大家可以多利用multi-stage來幫自己的python image做些瘦身

另外推薦大家兩個工具
一個是dfimage
另一個是dive
這兩個都可以用來分析docker image的組成


上一篇
Day 25 Jaeger 與 ElasticSearch在kubernetes上的串接
下一篇
Day 27 Dockerfile Refine Node. js 篇
系列文
從零開始的Kubernetes轉換30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言