Alpine ndalon ndërtimin e Docker për Python 50 herë më të ngadalta dhe imazhet gjithashtu janë dy herë më të r heavy.

Alpine ndalon ndërtimin e Docker për Python 50 herë më të ngadalta dhe imazhet gjithashtu janë dy herë më të r heavy.

Alpine Linux është shpesh e rekomanduar si imazhi bazë për Docker. Ju thuhet se përdorimi i Alpine do t'i bëjë ndërtimet tuaja më të vogla dhe procesin e ndërtimit më të shpejtë.

Por nëse përdorni Alpine Linux për aplikacione Python, atëherë ai:

  • E bĂ«n ndĂ«rtimin tuaj shumĂ« mĂ« tĂ« ngadalshĂ«m.
  • E bĂ«n imazhet tuaja mĂ« tĂ« mĂ«dha.
  • I humb kohĂ«n tuaj.
  • Dhe nĂ« fund mund tĂ« bĂ«het shkak pĂ«r gabime nĂ« kohĂ«n e ekzekutimit.


Le të shohim pse rekomandohet Alpine, por pse ju ende nuk duhet ta përdorni atë me Python.

Pse njerëzit rekomandojnë Alpine?

Le të supozojmë se na nevojitet gcc si pjesë e imazhit tonë dhe ne duam të krahasojmë Alpine Linux me Ubuntu 18.04 për shpejtësinë e ndërtimit dhe madhësinë përfundimtare të imazhit.

Së pari, do të shkarkojmë dy imazhe dhe do të krahasojmë madhësinë e tyre:

$ 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

Siç e shihni, imazhi bazë për Alpine është shumë më i vogël. Tani le të provojmë të instalojmë gcc dhe të fillojmë 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/*

Shkrimi i Dockerfile-it ideal kalon jashtë kësaj artikulli.

Le të masim shpejtësinë e ndërtimit:

$ 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

Përsërisim të njëjtën gjë për Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Ndërtojmë, shikojmë kohën dhe madhësinë e ndërtimit:

$ 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

Siç e premtuam, imazhet e bazuara në Alpine ndërtohen më shpejt dhe vetë janë më të vogla: 15 sekonda në vend të 30 dhe madhësia e imazhit është 105MB krahasuar me 150MB. Kjo është mjaft mirë!

Por nëse ne kthehemi në ndërtimin e një aplikacioni Python, gjërat nuk janë aq të bukura.

Imazhi Python

Aplikacionet Python shpesh përdorin pandas dhe matplotlib. Prandaj, një nga mundësitë është të merret imazhi zyrtar i bazuar në Debian, duke përdorur një Dockerfile të tillë:

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

E ndërtuam atë:

$ 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

Ne marrë një imazh me madhësi 363MB.
A do të na dalë më mirë me Alpine? Le të Provojmë:

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

ÇfarĂ« po ndodh?

Alpine nuk mbështet wheels

Nëse shikoni në ndërtimin që bazohet në Debian, do të shihni se ai shkarkon matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Ky është një binar për wheel. Alpine shkarkon burimet `matplotlib-3.1.2.tar.gz` sepse ai nuk mbështet standardin wheels.

Pse? Shumica e distribucioneve Linux përdorin versionin GNU (glibc) të bibliotekës standarde C, e cila në fakt është e nevojshme për çdo program të shkruar në C, duke përfshirë Python. Por Alpine përdor `musl`, dhe këta binarë janë për `glibc`, prandaj nuk janë një opsion.

Prandaj, nëse përdorni Alpine, ju nevojitet të kompiloni të gjithë kodin e shkruar në C, në çdo paketë Python.

Ah, po, lista e të gjitha atyre varësive që duhet të kompilohet do të duhet ta kërkoni vetë.
Në këtë rast, marrim kështu:

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

Dhe koha e ndërtimit zgjat



 25 minuta 57 sekonda! Dhe madhësia e imazhit është 851MB.

Imazhet që bazohen në Alpine ndërtohen shumë më gjatë, ato vetë janë më të mëdha dhe ju duhet gjithashtu të kërkoni të gjitha varësitë. Megjithatë, mund të zvogëloni madhësinë e ndërtimit duke përdorur ndërtime me shumë etapa por kjo do të thotë se duhet të bëni edhe më shumë punë.

Kjo nuk është e gjitha!

Alpine mund të jetë shkaku i defekteve të papritura në runtime

  • NĂ« teori, musl Ă«shtĂ« kompatibil me glibc, por nĂ« praktikĂ«, dallimet mund tĂ« shkaktojnĂ« shumĂ« probleme. Dhe nĂ«se ndodhin, ato sigurisht qĂ« do tĂ« jenĂ« tĂ« padĂ«shirueshme. Ja disa probleme qĂ« mund tĂ« ndodhin:
  • Alpine, me default, ka njĂ« madhĂ«si mĂ« tĂ« vogĂ«l tĂ« stack-ut tĂ« thread-it, qĂ« mund tĂ« çojĂ« nĂ« gabime nĂ« Python
  • Disa pĂ«rdorues kanĂ« zbuluar se aplikacionet Python punojnĂ« mĂ« ngadalĂ« pĂ«r shkak tĂ« mĂ«nyrĂ«s se si musl rezervon memorie (e ndryshme nga glibc).
  • NjĂ« nga pĂ«rdoruesit ka zbuluar njĂ« gabim gjatĂ« formatimit tĂ« datĂ«s

Sigurisht që këto gabime janë rregulluar tashmë, por kush e di sa të tjera ka.

Mos përdorni imazhe Alpine për Python

NĂ«se nuk doni tĂ« mĂ«rziteni me ndĂ«rtimet e mĂ«dha dhe tĂ« gjata, kĂ«rkimin e varĂ«sive dhe gabimet potenciale — mos e pĂ«rdorni Alpine Linux si njĂ« imazh bazĂ«. Zgjedhja e njĂ« imazhi tĂ« mirĂ« tĂ« bazĂ«s.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster