Alpine-ը Python-ի համար Docker build-երը 50 անգամ ավելի դանդաղ է հավաքում, իսկ պատկերները 2 անգամ ավելի ծանր են

Alpine-ը Python-ի համար Docker build-երը 50 անգամ ավելի դանդաղ է հավաքում, իսկ պատկերները 2 անգամ ավելի ծանր են

Alpine Linux-ը հաճախ առաջարկվում է որպես Docker-ի բազային պատկեր: Ձեզ ասում են, որ Alpine-ի օգտագործումը ձեր կառուցումները կփոքրացնի, իսկ կառուցման գործընթացը՝ ավելի արագ:

Բայց եթե օգտագործում եք Alpine Linux Python հավելվածների համար, ապա դա.

  • Ձեր կառուցումները շատ ավելի դանդաղ են դարձնում
  • Ձեր պատկերներն ավելի մեծ է դարձնում
  • Ձեր ժամանակը վատնելը
  • Եվ վերջում դա կարող է առաջացնել սխալներ գործարկման ժամանակ


Եկեք նայենք, թե ինչու է Alpine-ը առաջարկվում, բայց ինչու դեռ չպետք է օգտագործեք այն Python-ի հետ:

Ինչու են մարդիկ խորհուրդ տալիս Alpine-ը:

Ենթադրենք, որ մեզ անհրաժեշտ է gcc որպես մեր պատկերի մաս, և մենք ցանկանում ենք համեմատել Alpine Linux-ն ընդդեմ Ubuntu 18.04-ի՝ կառուցման արագության և վերջնական պատկերի չափի առումով:

Նախ, եկեք ներբեռնենք երկու պատկեր և համեմատենք դրանց չափերը.

$ 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

Ինչպես տեսնում եք, Alpine-ի բազային պատկերը շատ ավելի փոքր է: Եկեք հիմա փորձենք տեղադրել gcc և սկսել 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/*

Կատարյալ Dockerfile-ը գրելը դուրս է այս հոդվածի շրջանակներից:

Եկեք չափենք հավաքման արագությունը.

$ 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

Մենք կրկնում ենք նույնը Alpine-ի համար (Dockerfile).

FROM alpine
RUN apk add --update gcc

Մենք հավաքում ենք, նայում ենք հավաքի ժամանակին և չափին.

$ 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

Ինչպես խոստացվել էր, Alpine-ի վրա հիմնված պատկերները հավաքվում են ավելի արագ և ավելի փոքր՝ 15 վայրկյան 30-ի փոխարեն, և պատկերի չափը 105 ՄԲ է 150 ՄԲ-ի դիմաց: Դա բավականին լավ է:

Բայց եթե անցնենք Python հավելվածի կառուցմանը, ապա ամեն ինչ այնքան էլ վարդագույն չէ։

Python պատկեր

Python հավելվածները հաճախ օգտագործում են պանդաներ և matplotlib: Հետևաբար, տարբերակներից մեկն է՝ վերցնել պաշտոնական Debian-ի վրա հիմնված պատկերը՝ օգտագործելով այս Dockerfile-ը.

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

Եկեք հավաքենք այն.

$ 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

Մենք ստանում ենք 363 ՄԲ չափի պատկեր:
Alpine-ի հետ ավելի լավ կլինի՞: Արի փորձենք:

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

Ինչ է կատարվում:

Alpine-ը չի աջակցում անիվներին

Եթե ​​նայեք build-ին, որը հիմնված է Debian-ի վրա, կտեսնեք, որ այն ներբեռնում է matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64:whl.

Սա երկուական անիվի համար է: Alpine-ը ներբեռնում է «matplotlib-3.1.2.tar» աղբյուրները:gzքանի որ այն չի աջակցում ստանդարտին կոնտ, Ալյում.հեծ..

Ինչո՞ւ։ Linux բաշխումների մեծ մասը օգտագործում է C ստանդարտ գրադարանի GNU տարբերակը (glibc), որն իրականում պահանջվում է C-ով գրված յուրաքանչյուր ծրագրի, ներառյալ Python-ը: Բայց Alpine-ն օգտագործում է «musl», և քանի որ այդ երկուականները նախատեսված են «glibc»-ի համար, դրանք պարզապես տարբերակ չեն:

Հետևաբար, եթե օգտագործում եք Alpine, ապա պետք է կազմեք C-ով գրված բոլոր կոդը Python-ի յուրաքանչյուր փաթեթում։

Օ, այո, դուք ստիպված կլինեք փնտրել բոլոր նման կախվածությունների ցանկը, որոնք պետք է ինքներդ կազմեք:
Այս դեպքում մենք ստանում ենք հետևյալը.

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

Իսկ կառուցման ժամանակը տևում է...

... 25 րոպե 57 վայրկյան! Իսկ պատկերի չափը 851 ՄԲ է։

Ալպյան վրա հիմնված պատկերների կառուցումը շատ ավելի երկար է տևում, դրանք ավելի մեծ են չափերով, և դուք դեռ պետք է փնտրեք բոլոր կախվածությունները: Դուք, իհարկե, կարող եք նվազեցնել հավաքի չափը, օգտագործելով բազմաստիճան կառուցումներ բայց դա նշանակում է, որ ավելի շատ աշխատանք է պետք անել:

Սա դեռ ամենը չէ:

Alpine-ը կարող է անսպասելի սխալներ առաջացնել գործարկման ժամանակ

  • Տեսականորեն musl-ը համատեղելի է glibc-ի հետ, սակայն գործնականում տարբերությունները կարող են բազմաթիվ խնդիրներ առաջացնել։ Իսկ եթե դրանք լինեն, ապա հավանաբար տհաճ կլինեն։ Ահա մի քանի խնդիրներ, որոնք կարող են առաջանալ.
  • Alpine-ն ունի լռելյայն ավելի փոքր թելերի կույտի չափ, ինչը կարող է հանգեցնել սխալներ Python-ում
  • Որոշ օգտատերեր գտել են դա Python հավելվածներն ավելի դանդաղ են աշխատում musl-ի հիշողությունը հատկացնելու ձևի պատճառով (տարբերվում է glibc-ից):
  • Օգտագործողներից մեկը սխալ է հայտնաբերվել ամսաթիվը ձևաչափելիս

Իհարկե, այս սխալներն արդեն ուղղվել են, բայց ով գիտի, թե դեռ քանիսը կլինեն։

Մի օգտագործեք ալպիական պատկերներ Python-ի համար

Եթե ​​դուք չեք ցանկանում անհանգստանալ մեծ և երկար կառուցումների, կախվածության և հնարավոր սխալների որոնման հետ, մի օգտագործեք Alpine Linux-ը որպես հիմնական պատկեր: Ընտրելով լավ բազային պատկեր.

Source: www.habr.com

Добавить комментарий