Alpine yn adeiladu adeiladau Docker ar gyfer Python 50x yn arafach a delweddau 2x yn drymach

Alpine yn adeiladu adeiladau Docker ar gyfer Python 50x yn arafach a delweddau 2x yn drymach

Mae Alpine Linux yn aml yn cael ei argymell fel delwedd sylfaenol ar gyfer Docker. Dywedir wrthych y bydd defnyddio Alpaidd yn gwneud eich adeiladau'n llai a'ch proses adeiladu yn gyflymach.

Ond os ydych chi'n defnyddio Alpine Linux ar gyfer cymwysiadau Python, yna mae'n:

  • Yn gwneud eich adeiladu yn llawer arafach
  • Yn gwneud eich delweddau yn fwy
  • Gwastraffu eich amser
  • Ac yn y diwedd gall achosi gwallau mewn amser rhedeg


Gadewch i ni edrych ar pam mae Alpaidd yn cael ei argymell, ond pam na ddylech chi ei ddefnyddio gyda Python o hyd.

Pam mae pobl yn argymell Alpaidd?

Gadewch i ni dybio bod angen gcc arnom fel rhan o'n delwedd ac rydym am gymharu Alpine Linux yn erbyn Ubuntu 18.04 o ran cyflymder adeiladu a maint delwedd derfynol.

Yn gyntaf, gadewch i ni lawrlwytho dwy ddelwedd a chymharu eu meintiau:

$ 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

Fel y gallwch weld, mae'r ddelwedd sylfaenol ar gyfer Alpaidd yn llawer llai. Gadewch i ni nawr geisio gosod gcc a dechrau gyda 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/*

Mae ysgrifennu'r Dockerfile perffaith y tu hwnt i gwmpas yr erthygl hon.

Gadewch i ni fesur cyflymder y cynulliad:

$ 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

Rydym yn ailadrodd yr un peth ar gyfer Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Rydyn ni'n ymgynnull, yn edrych ar amser a maint y cynulliad:

$ 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

Fel yr addawyd, mae delweddau Alpaidd yn cael eu casglu'n gyflymach ac yn llai: 15 eiliad yn lle 30 a maint y ddelwedd yw 105MB yn erbyn 150MB. Mae'n eithaf da!

Ond os byddwn yn newid i adeiladu cais Python, yna nid yw popeth mor rosy.

Delwedd Python

Mae cymwysiadau Python yn aml yn defnyddio pandas a matplotlib. Felly, un opsiwn yw cymryd y ddelwedd swyddogol yn seiliedig ar Debian gan ddefnyddio'r Dockerfile hwn:

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

Gadewch i ni ei gasglu:

$ 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

Rydyn ni'n cael delwedd o 363MB o faint.
A fyddwn ni'n gwneud yn well gydag Alpau? Gadewch i ni geisio:

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

Beth sy'n digwydd?

Nid yw alpaidd yn cynnal olwynion

Os edrychwch ar yr adeilad, sy'n seiliedig ar Debian, fe welwch ei fod yn lawrlwytho matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Deuaidd ar gyfer olwyn yw hwn. Mae Alpaidd yn lawrlwytho'r ffynonellau `matplotlib-3.1.2.tar.gz` gan nad yw'n cefnogi safon olwynion.

Pam? Mae'r rhan fwyaf o ddosbarthiadau Linux yn defnyddio'r fersiwn GNU (glibc) o'r llyfrgell safonol C, sydd mewn gwirionedd yn ofynnol gan bob rhaglen a ysgrifennwyd yn C, gan gynnwys Python. Ond mae Alpaidd yn defnyddio `musl`, a chan fod y deuaidd hynny wedi'u cynllunio ar gyfer `glibc`, nid ydynt yn opsiwn.

Felly, os ydych chi'n defnyddio Alpaidd, mae angen i chi lunio'r holl god sydd wedi'i ysgrifennu yn C ym mhob pecyn Python.

O, ie, bydd yn rhaid i chi edrych am y rhestr o'r holl ddibyniaethau o'r fath y mae angen eu llunio eich hun.
Yn yr achos hwn rydym yn cael hyn:

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

Ac mae'r amser adeiladu yn cymryd ...

... 25 munud 57 eiliad! A maint y ddelwedd yw 851MB.

Mae delweddau sy'n seiliedig ar alpaidd yn cymryd llawer mwy o amser i'w hadeiladu, maent yn fwy o ran maint, ac mae angen i chi chwilio am yr holl ddibyniaethau o hyd. Wrth gwrs, gallwch leihau maint y cynulliad gan ddefnyddio adeiladau aml-gam ond mae hynny'n golygu bod angen gwneud mwy fyth o waith.

Nid dyna'r cyfan!

Gall Alpaidd achosi chwilod annisgwyl yn ystod amser rhedeg

  • Mewn theori, mae musl yn gydnaws â glibc, ond yn ymarferol gall y gwahaniaethau achosi llawer o broblemau. Ac os ydynt, mae'n debyg y byddant yn annymunol. Dyma rai problemau a all godi:
  • Mae gan Alpaidd faint pentwr edau llai yn ddiofyn, a all arwain at gwallau yn Python
  • Mae rhai defnyddwyr wedi darganfod hynny Mae cymwysiadau Python yn arafach oherwydd y ffordd y mae musl yn dyrannu cof (yn wahanol i glibc).
  • Un o'r defnyddwyr dod o hyd i wall wrth fformatio'r dyddiad

Diau fod y gwallau hyn eisoes wedi eu cywiro, ond pwy a wyr faint yn rhagor a fydd.

Peidiwch â defnyddio delweddau Alpaidd ar gyfer Python

Os nad ydych chi am drafferthu gydag adeiladau mawr a hir, gan chwilio am ddibyniaethau a gwallau posibl, peidiwch â defnyddio Alpine Linux fel delwedd sylfaenol. Dewis delwedd sylfaen dda.

Ffynhonnell: hab.com

Ychwanegu sylw