ProHoster > blog > Gweinyddiaeth > 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).
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.