Alpine ndryn Docker ndërtimet për Python 50 herë më ngadalë, ndërsa imazhet janë 2 herë më të rënda

Alpine ndryn Docker ndërtimet për Python 50 herë më ngadalë, ndërsa imazhet janë 2 herë më të rënda

Alpine Linux — shpesh rekomandohet si njĂ« imazh bazĂ« pĂ«r Docker. Ju thonĂ« se pĂ«rdorimi i Alpine do ta bĂ«jĂ« ndĂ«rtimin tuaj mĂ« tĂ« vogĂ«l dhe procesin e ndĂ«rtimit mĂ« tĂ« shpejtĂ«.

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

  • E bĂ«n ndĂ«rtimin tuaj shumĂ« mĂ« tĂ« ngadalshĂ«m
  • E bĂ«n imazhin tuaj mĂ« tĂ« madh
  • E humb kohĂ«n tuaj
  • Dhe pĂ«rfundimisht mund tĂ« bĂ«het shkak pĂ«r gabime nĂ« kohĂ«n e ekzekutimit


Le të shqyrtojmë pse rekomandohet Alpine, por pse ju 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 duam të krahasojmë Alpine Linux me Ubuntu 18.04, për shpejtësinë e ndërtimit dhe madhësinë përfundimtare të imazhit.

Për fillim, ngarkohet dy imazhe dhe 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. Le të provojmë tani të instalojmë gcc dhe 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 ideale tejkalon qëllimin e këtij 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ë, shohim se sa merr koha 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 premtova, imazhet bazë Alpine ndërtohen më shpejt dhe janë më të vogla: 15 sekonda në vend të 30 dhe madhësia e imazhit 105MB kundrejt 150MB. Kjo është mjaft e mirë!

Por nëse kalojmë në ndërtimin e një aplikacioni Python, atëherë gjithçka nuk është kaq rozë.

Imazhi Python

Aplikacionet Python shpesh përdorin pandas dhe matplotlib. Prandaj, një nga opsionet është të marrësh imazhin zyrtar bazuar në Debian, duke përdorur një Dockerfile të tillë:

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

Ndërtojmë atë:

$ docker build -f Dockerfile.slim -t python-matpan.
Dërgimi i kontekstit të ndërtimit në daemon-in Docker  3.072kB
Hapi 1/2 : NGA python:3.8-slim
 ---> 036ea1506a85
Hapi 2/2 : RUN pip install --no-cache-dir matplotlib pandas
 ---> Po ekzekutohet në 13739b2a0917
Krahason matplotlib
  Duke shkarkuar matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl (13.1 MB)
Krahason pandas
  Duke shkarkuar pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4 MB)
...
Ndërtimi përfundoi me sukses b98b5dc06690
Etiketa përfundimtare python-matpan:latest

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

Po marrim një imazh me madhësi 363MB.
A do na dalë më mirë me Alpine? Le ta provojmë:

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

$ docker build -t python-matpan-alpine -f Dockerfile.alpine .                                 
Dërgimi i kontekstit të ndërtimit në daemon-in Docker  3.072kB                                               
Hapi 1/2 : NGA python:3.8-alpine                                                             
 ---> a0ee0c90a0db                                                                            
Hapi 2/2 : RUN pip install --no-cache-dir matplotlib pandas                                                  
 ---> Po ekzekutohet në 6740adad3729                                                                 
Krahason matplotlib                                                                         
  Duke shkarkuar matplotlib-3.1.2.tar.gz (40.9 MB)                                               
    ERROR: Komanda dështoi me statusin dalës 1:                                            
     komanda: \/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: Komanda dështoi me statusin dalës 1: python setup.py egg_info Shikoni logët për rezultate të plota të komandës.
Komanda '\/bin\/sh -c pip install matplotlib pandas' solli një kod jo zero: 1

ÇfarĂ« po ndodh?

Alpine nuk mbështet wheels

Nëse shikoni ndërtimin që bazohet në Debian, do të vini re se 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`, pasi ai nuk mbështet standardin wheels.

Pse? Shumica e shpërndarjeve Linux përdorin versionin GNU (glibc) të bibliotekës standarde C, e cila është e nevojshme për çdo program të shkruar në C, duke përfshirë Python. Por Alpine përdor `musl`, dhe pasi ato binarë janë të destinuar për `glibc`, ata thjesht nuk funksionojnë.

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

Ah, po, lista e të gjitha varësive të tilla që duhet të kompiloni do t'ju duhet ta kërkoni vetë.
Në këtë rast, kemi diçka të tillë:

NGA 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 merr...


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

Imazhet bazuar në Alpine mblidhen shumë më gjatë, vetë ata janë të mëdha dhe ju gjithashtu duhet të kërkoni të gjitha varësitë. Natyrisht, mund të zvogëloni madhësinë e ndërtimit duke përdorur ndërtimet me shumë etapa por kjo do të thotë se duhet të punoni edhe më shumë.

Kjo nuk është gjithçka!

Alpine mund të jetë shkaku i defekteve të papritura gjatë ekzekutimit

  • NĂ« teori, musl Ă«shtĂ« i pĂ«rputhshĂ«m me glibc, por nĂ« praktikĂ«, ndryshimet mund tĂ« shkaktojnĂ« shumĂ« probleme. Dhe nĂ«se ndodhin, ato sigurisht qĂ« do tĂ« jenĂ« tĂ« pakĂ«ndshme. Ja disa probleme qĂ« mund tĂ« ndodhin:
  • Alpine, sipas tĂ« dhĂ«nave, ka madhĂ«si mĂ« tĂ« vogĂ«l tĂ« stack-ut tĂ« thread-it, gjĂ« qĂ« mund tĂ« çojĂ« nĂ« gabime nĂ« Python
  • Disa pĂ«rdorues kanĂ« zbuluar se aplikacionet Python funksionojnĂ« mĂ« ngadalĂ« pĂ«r shkak tĂ« mĂ«nyrĂ«s se si, musl alokton memorie (nuk Ă«shtĂ« e njĂ«jtĂ« me glibc).
  • NjĂ« nga pĂ«rdoruesit zbuloi njĂ« gabim nĂ« formatimin e datĂ«s

Sigurisht, këto gabime tashmë janë rregulluar, por kush e di sa shumë janë ende.

Mos përdorni imazhe Alpine për Python

NĂ«se nuk dĂ«shironi tĂ« merreni me ndĂ«rtime tĂ« mĂ«dha dhe tĂ« gjata, kĂ«rkimin e varĂ«sive dhe gabime tĂ« mundshme — mos pĂ«rdorni Alpine Linux si imazh bazĂ«. Zgjedhja e njĂ« imazhi tĂ« mirĂ« bazĂ«.

Burimi: habr.com

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