
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 .
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 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
- Néhány felhasználó felfedezte, hogy mivel a musl másképp kezeli a memóriát (ez eltér a glibc-től).
- Az egyik felhasználó
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. .
Forrás: habr.com
