Az Alpine a Python Docker buildjeit 50-szer lassabban állítja elő, és a képek 2-szer nehezebbek.

Az Alpine a Python Docker buildjeit 50-szer lassabban állítja elő, és a képek 2-szer nehezebbek.

Az Alpine Linux — gyakran ajánlják alapként Docker-hez. Azt mondják, hogy az Alpine használata kisebbé teszi a buildjeidet, és gyorsabbá a gyártási folyamatokat.

De ha Python alkalmazásokhoz használod az Alpine Linuxot, akkor:

  • Jelentősen lassabbá teszi a buildjeidet.
  • Nagyobbá teszi a képeidet.
  • Elpazarolja az idődet.
  • És végül runtime hibákat okozhat.


Nézzük meg, hogy miért ajánlják az Alpine-t, de miért nem érdemes együtt használni a Pythonnal.

Miért ajánlják az emberek az Alpine-t?

Tegyük fel, hogy szükségünk van a gcc-re az imázsunk részeként, és szeretnénk összehasonlítani az Alpine Linux-ot és az Ubuntu 18.04-et a build sebessége és a végső kép mérete alapján.

Először töltsük le a két képet, és hasonlítsuk össze a méretüket:

$ 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

Mint látod, az alap kép az Alpine esetében jóval kisebb. Most próbáljuk meg telepíteni a gcc-t, és kezdjük az Ubuntu-val:

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 tökéletes Dockerfile írása túlmutat ezen a cikken.

Mérjük a build sebességét:

$ 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

Ismételjük meg ugyanazt az Alpine esetében (Dockerfile):

FROM alpine
RUN apk add --update gcc

Buildeljük, nézzük az időt és a build méretét:

$ 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

Ahogy ígértük, az Alpine alapú képek gyorsabban buildelődnek és kisebbek: 15 másodperc a 30 helyett, és a kép mérete 105MB a 150MB ellenében. Ez elég jó!

De ha áttérünk egy Python alkalmazás buildelésére, akkor minden nem ennyire rózsás.

Python kép

A Python alkalmazások gyakran használják a pandas-t és a matplotlib-et. Ezért az egyik lehetőség egy hivatalos Debian alapú kép használata, egy ilyen Dockerfile-lal:

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

Buildeljük az alkalmazást:

$ docker build -f Dockerfile.slim -t python-matpan.
Küldés a build környezethez a Docker daemonhoz  3.072kB
1/2 lépés: FROM python:3.8-slim
 ---> 036ea1506a85
2/2 lépés: RUN pip install --no-cache-dir matplotlib pandas
 ---> Futtatás itt: 13739b2a0917
Matplotlib letöltése
  Letöltés: matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl (13.1 MB)
Pandas letöltése
  Letöltés: pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4 MB)
...
Sikeresen létrehozva: b98b5dc06690
Sikeresen címkézve: python-matpan:latest

valós    0m30.297s
felhasználó  0m0.043s
rendszer     0m0.020s

Egy 363 MB méretű képet kapunk.
Jobban fogunk járni az Alpine-nal? Próbáljuk ki:

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

$ docker build -t python-matpan-alpine -f Dockerfile.alpine .                                 
Küldés a build környezethez a Docker daemonhoz  3.072kB                                               
1/2 lépés: FROM python:3.8-alpine                                                             
 ---> a0ee0c90a0db                                                                            
2/2 lépés: RUN pip install --no-cache-dir matplotlib pandas                                                  
 ---> Futtatás itt: 6740adad3729                                                                 
Matplotlib letöltése                                                                         
  Letöltés: matplotlib-3.1.2.tar.gz (40.9 MB)                                               
    HIBA: A parancs hibával távozott, kilépési státusz: 1:                                            
     parancs: /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                              

...
HIBA: A parancs hibával távozott, kilépési státusz: 1: python setup.py egg_info Ellenőrizze a naplókat a teljes parancsi kimenetért.
A parancs '/bin/sh -c pip install matplotlib pandas' nem nulla kódot adott vissza: 1

Mi történik?

Az Alpine nem támogatja a wheel formátumot.

Ha megnézed az Ubuntu-ra épülő buildet, látni fogod, hogy letölti a matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64-et.whl.

Ez a bináris fájl a wheel-hez. Az Alpine forráskódokat tölt le: `matplotlib-3.1.2.tar.gz`, mivel nem támogatja a standard wheel formátumokat..

Miért? A legtöbb Linux disztribúció a GNU verziót (glibc) használja a C szabványos könyvtárból, amely minden C nyelven írt programhoz, beleértve a Pythont is, szükséges. De az Alpine `musl`-t használ, és mivel ezek a bináris fájlok `glibc`-ra készültek, egyszerűen nem alkalmasak.

Ezért, ha Alpine-t használsz, minden C nyelven írt kódot le kell fordítanod minden Python csomagban.

Ó, igen, a megfelelő függőségek listáját, amelyeket le kell fordítani, neked kell keresned.
Ebben az esetben ezt kapjuk:

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

És a build idő…

… 25 perc 57 másodperc! A kép mérete 851MB.

Az Alpine alapú képek sokkal tovább készülnek, nagyobb méretűek, és még az összes függőség keresése is szükséges. Persze csökkenthetjük a build méretét a több lépcsős build de ez azt jelenti, hogy még több munkát kell elvégezni.

Ez még nem minden!

Az Alpine váratlan hibákat okozhat a futási időben

  • Elméletben a musl kompatibilis a glibc-vel, de a gyakorlatban a különbségek sok problémát okozhatnak. Ha pedig lesznek ilyenek, azok biztosan kellemetlenek lesznek. Íme néhány probléma, ami felmerülhet:
  • Alpine alapértelmezés szerint kisebb szálverem méretet használ, ami vezethet hibákhoz Pythonban
  • Néhány felhasználó felfedezte, hogy a Python alkalmazások lassabban működnek mivel a musl másképp kezeli a memóriát (ez eltér a glibc-től).
  • Az egyik felhasználó hibát észlelt a dátumformátumban

Biztos, hogy ezeket a hibákat már kijavították, de ki tudja, hány van még.

Ne használj Alpine képeket Pythonhoz

Ha nem akarsz nagy és hosszadalmas builddel, függőségek keresésével és potenciális hibákkal bajlódni — ne használd az Alpine Linuxot alapértelmezett képként. Jó alap kép választása.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster