Alpine jikkompila Docker builds għal Python 50 darba aktar bil-mod, u l-immaġini huma darbtejn itqal

Alpine jikkompila Docker builds għal Python 50 darba aktar bil-mod, u l-immaġini huma darbtejn itqal

Alpine Linux huwa spiss rakkomandat bħala immaġni bażi għal Docker. Qalek li l-użu ta' Alpine se jagħmel il-bini tiegħek iżgħar u l-proċess tal-bini tiegħek aktar mgħaġġel.

Imma jekk tuża Alpine Linux għal applikazzjonijiet Python, allura dan:

  • Jagħmel il-bini tiegħek ħafna aktar bil-mod
  • Jagħmel l-immaġini tiegħek akbar
  • Taħli l-ħin tiegħek
  • U fl-aħħar jista 'jikkawża żbalji fir-runtime


Ejja nħarsu lejn għaliex Alpine huwa rakkomandat, iżda għaliex xorta m'għandekx tużah ma 'Python.

Għaliex in-nies jirrakkomandaw Alpine?

Ejja nassumu li għandna bżonn gcc bħala parti mill-immaġni tagħna u rridu nqabblu Alpine Linux vs Ubuntu 18.04 f'termini ta 'veloċità tal-bini u daqs tal-immaġni finali.

L-ewwel, ejja tniżżel żewġ stampi u nqabblu d-daqsijiet tagħhom:

$ 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

Kif tistgħu taraw, l-immaġni bażi għal Alpine hija ħafna iżgħar. Issa ejja nippruvaw ninstallaw gcc u nibdew b'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/*

Il-kitba tad-Dockerfile perfetta hija lil hinn mill-ambitu ta 'dan l-artikolu.

Ejja nkejlu l-veloċità tal-assemblaġġ:

$ 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

Nirrepetu l-istess għal Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Aħna niġbru, inħarsu lejn il-ħin u d-daqs tal-assemblaġġ:

$ 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

Kif imwiegħed, immaġini bbażati fuq l-Alpi jinġabru aktar malajr u huma iżgħar: 15-il sekonda minflok 30 u d-daqs tal-immaġni huwa 105MB kontra 150MB. Huwa pjuttost tajjeb!

Imma jekk naqilbu għall-bini ta 'applikazzjoni Python, allura kollox mhux daqshekk ward.

Immaġini Python

L-applikazzjonijiet Python spiss jużaw pandas u matplotlib. Għalhekk, għażla waħda hija li tieħu l-immaġni uffiċjali bbażata fuq Debian billi tuża dan il-Dockerfile:

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

Ejja niġbruha:

$ 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

Ikollna immaġni ta 'daqs ta' 363MB.
Se nagħmlu aħjar ma' Alpine? Ejja nipruvaw:

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

X'inhu għaddej?

Alpine ma jappoġġjax ir-roti

Jekk tħares lejn il-bini, li huwa bbażat fuq Debian, se tara li tniżżel matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Dan huwa binarju għar-rota. Alpine tniżżel is-sorsi `matplotlib-3.1.2.tar.gz` peress li ma jappoġġjax standard roti.

Għaliex? Il-biċċa l-kbira tad-distribuzzjonijiet tal-Linux jużaw il-verżjoni GNU (glibc) tal-librerija standard C, li fil-fatt hija meħtieġa minn kull programm miktub fis-C, inkluż Python. Iżda Alpine juża "musl", u peress li dawk il-binarji huma ddisinjati għal "glibc", sempliċement mhumiex għażla.

Għalhekk, jekk tuża Alpine, għandek bżonn tiġbor il-kodiċi kollu miktub f'Ċ f'kull pakkett Python.

Oh, iva, ser ikollok tfittex il-lista tad-dipendenzi kollha bħal dawn li jeħtieġ li jiġu kkompilati lilek innifsek.
F'dan il-każ niksbu dan:

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

U l-ħin tal-bini jieħu...

... 25 minuta 57 sekonda! U d-daqs tal-immaġni huwa 851MB.

Immaġini bbażati fuq l-Alpi jieħdu ħafna aktar żmien biex jinbnew, huma akbar fid-daqs, u xorta trid tfittex id-dipendenzi kollha. Tista' naturalment tnaqqas id-daqs tal-assemblaġġ bl-użu bini f'diversi stadji iżda dan ifisser li jrid isir saħansitra aktar xogħol.

Dak mhux kollox!

Alpine jista 'jikkawża bugs mhux mistennija waqt ir-runtime

  • Fit-teorija, il-musl huwa kompatibbli mal-glibc, iżda fil-prattika d-differenzi jistgħu jikkawżaw ħafna problemi. U jekk huma, probabbilment se jkunu spjaċevoli. Hawn huma xi problemi li jistgħu jseħħu:
  • Alpine għandha daqs iżgħar munzell ħajt awtomatikament, li jista 'jwassal għal żbalji f'Python
  • Xi utenti sabu dan L-applikazzjonijiet Python huma aktar bil-mod minħabba l-mod kif musl jalloka memorja (differenti minn glibc).
  • Wieħed mill-utenti sab żball meta tifformattja d-data

Żgur li dawn l-iżbalji diġà ġew ikkoreġuti, imma min jaf kemm se jkun hemm aktar.

Tużax immaġini Alpini għal Python

Jekk ma tridx tolqot bi bini kbar u twal, tfittex dipendenzi u żbalji potenzjali, tużax Alpine Linux bħala immaġni bażi. Għażla ta 'immaġni bażi tajba.

Sors: www.habr.com

Żid kumment