Alpine setur saman Docker smíðar fyrir Python 50 sinnum hægar og myndirnar eru 2 sinnum þyngri

Alpine setur saman Docker smíðar fyrir Python 50 sinnum hægar og myndirnar eru 2 sinnum þyngri

Alpine Linux er oft mælt með sem grunnmynd fyrir Docker. Þér er sagt að notkun Alpine muni gera smíðin minni og smíðaferlið hraðar.

En ef þú notar Alpine Linux fyrir Python forrit, þá:

  • Gerir bygginguna þína mun hægari
  • Gerir myndirnar þínar stærri
  • Að sóa tíma þínum
  • Og á endanum getur það valdið villum í keyrslutíma


Við skulum skoða hvers vegna Alpine er mælt með, en hvers vegna þú ættir samt ekki að nota það með Python.

Af hverju mælir fólk með Alpine?

Gerum ráð fyrir að við þurfum gcc sem hluta af myndinni okkar og við viljum bera saman Alpine Linux vs Ubuntu 18.04 hvað varðar byggingarhraða og endanlega myndstærð.

Fyrst skulum við hlaða niður tveimur myndum og bera saman stærðir þeirra:

$ docker pull --quiet ubuntu:18.04
docker.io/library/ubuntu:18.04
$ docker pull --quiet alpine
docker.io/library/alpine:latest
$ docker image ls ubuntu:18.04
REPOSITORY          TAG        IMAGE ID         SIZE
ubuntu              18.04      ccc6e87d482b     64.2MB
$ docker image ls alpine
REPOSITORY          TAG        IMAGE ID         SIZE
alpine              latest     e7d92cdc71fe     5.59MB

Eins og þú sérð er grunnmyndin fyrir Alpine miklu minni. Við skulum nú reyna að setja upp gcc og byrja með Ubuntu:

FROM ubuntu:18.04
RUN apt-get update && 
    apt-get install --no-install-recommends -y gcc && 
    apt-get clean && rm -rf /var/lib/apt/lists/*

Að skrifa hið fullkomna Dockerfile er utan gildissviðs þessarar greinar.

Við skulum mæla samsetningarhraðann:

$ time docker build -t ubuntu-gcc -f Dockerfile.ubuntu --quiet .
sha256:b6a3ee33acb83148cd273b0098f4c7eed01a82f47eeb8f5bec775c26d4fe4aae

real    0m29.251s
user    0m0.032s
sys     0m0.026s
$ docker image ls ubuntu-gcc
REPOSITORY   TAG      IMAGE ID      CREATED         SIZE
ubuntu-gcc   latest   b6a3ee33acb8  9 seconds ago   150MB

Við endurtökum það sama fyrir Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Við setjum saman, skoðum tíma og stærð samsetningar:

$ time docker build -t alpine-gcc -f Dockerfile.alpine --quiet .
sha256:efd626923c1478ccde67db28911ef90799710e5b8125cf4ebb2b2ca200ae1ac3

real    0m15.461s
user    0m0.026s
sys     0m0.024s
$ docker image ls alpine-gcc
REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
alpine-gcc   latest   efd626923c14   7 seconds ago   105MB

Eins og lofað var, eru myndir byggðar á alpabyggðum hraðar og eru minni: 15 sekúndur í stað 30 og myndastærðin er 105MB á móti 150MB. Það er nokkuð gott!

En ef við skiptum yfir í að byggja Python forrit, þá er allt ekki svo bjart.

Python mynd

Python forrit nota oft pöndur og matplotlib. Þess vegna er einn valkostur að taka opinberu Debian-byggðu myndina með því að nota þessa Dockerfile:

FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas

Við skulum safna því:

$ docker build -f Dockerfile.slim -t python-matpan.
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM python:3.8-slim
 ---> 036ea1506a85
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas
 ---> Running in 13739b2a0917
Collecting matplotlib
  Downloading matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl (13.1 MB)
Collecting pandas
  Downloading pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4 MB)
...
Successfully built b98b5dc06690
Successfully tagged python-matpan:latest

real    0m30.297s
user    0m0.043s
sys     0m0.020s

Við fáum mynd sem er 363MB að stærð.
Mun okkur ganga betur með Alpine? Reynum:

FROM python:3.8-alpine
RUN pip install --no-cache-dir matplotlib pandas

$ docker build -t python-matpan-alpine -f Dockerfile.alpine .                                 
Sending build context to Docker daemon  3.072kB                                               
Step 1/2 : FROM python:3.8-alpine                                                             
 ---> a0ee0c90a0db                                                                            
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas                                                  
 ---> Running in 6740adad3729                                                                 
Collecting matplotlib                                                                         
  Downloading matplotlib-3.1.2.tar.gz (40.9 MB)                                               
    ERROR: Command errored out with exit status 1:                                            
     command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/
tmp/pip-install-a3olrixa/matplotlib/setup.py'"'"'; __file__='"'"'/tmp/pip-install-a3olrixa/matplotlib/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-a3olrixa/matplotlib/pip-egg-info                              

...
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
The command '/bin/sh -c pip install matplotlib pandas' returned a non-zero code: 1

Hvað er að gerast

Alpine styður ekki hjól

Ef þú skoðar bygginguna, sem er byggð á Debian, muntu sjá að hún halar niður matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Þetta er tvöfaldur fyrir hjól. Alpine halar niður heimildunum `matplotlib-3.1.2.tar.gz` þar sem það styður ekki staðal hjól.

Hvers vegna? Flestar Linux dreifingar nota GNU útgáfuna (glibc) af C staðlaða bókasafninu, sem er í raun krafist af hverju forriti sem skrifað er í C, þar á meðal Python. En Alpine notar 'musl' og þar sem þessi tvöfaldur eru hannaður fyrir 'glibc' eru þau einfaldlega ekki valkostur.

Þess vegna, ef þú notar Alpine, þarftu að safna saman öllum kóða sem skrifaður er í C ​​í hverjum Python pakka.

Ó, já, þú verður að leita að listanum yfir allar slíkar ósjálfstæðir sem þarf að taka saman sjálfur.
Í þessu tilfelli fáum við þetta:

FROM python:3.8-alpine
RUN apk --update add gcc build-base freetype-dev libpng-dev openblas-dev
RUN pip install --no-cache-dir matplotlib pandas

Og byggingartíminn tekur...

... 25 mínútur 57 sekúndur! Og myndstærðin er 851MB.

Það tekur mun lengri tíma að smíða myndir sem byggja á alpa, þær eru stærri að stærð og þú þarft samt að leita að öllum ósjálfstæðum. Þú getur auðvitað minnkað samsetningarstærðina með því að nota fjölþrepa byggingar en það þýðir að það þarf að vinna enn meira.

Það er ekki allt!

Alpine getur valdið óvæntum villum í keyrslutíma

  • Fræðilega séð er musl samhæft við glibc, en í reynd getur munurinn valdið mörgum vandamálum. Og ef þeir eru það verða þeir líklega óþægilegir. Hér eru nokkur vandamál sem geta komið upp:
  • Alpine er sjálfgefið með minni þráðarstafla, sem getur leitt til villur í Python
  • Sumir notendur hafa fundið það Python forrit eru hægari vegna þess hvernig musl úthlutar minni (öðruvísi en glibc).
  • Einn notendanna fann villu við að forsníða dagsetninguna

Víst er búið að leiðrétta þessar villur, en hver veit hversu margar þær verða fleiri.

Ekki nota Alpine myndir fyrir Python

Ef þú vilt ekki nenna stórum og löngum byggingum, að leita að ósjálfstæði og hugsanlegum villum skaltu ekki nota Alpine Linux sem grunnmynd. Velja góða grunnmynd.

Heimild: www.habr.com

Bæta við athugasemd