
Alpine Linux është shpesh e rekomanduar si imazhi bazë për Docker. Ju thuhet se përdorimi i Alpine do t'i bëjë ndërtimet tuaja më të vogla dhe procesin e ndërtimit më të shpejtë.
Por nëse përdorni Alpine Linux për aplikacione Python, atëherë ai:
- E bën ndërtimin tuaj shumë më të ngadalshëm.
- E bën imazhet tuaja më të mëdha.
- I humb kohën tuaj.
- Dhe në fund mund të bëhet shkak për gabime në kohën e ekzekutimit.
Le të shohim pse rekomandohet Alpine, por pse ju ende 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 ne duam të krahasojmë Alpine Linux me Ubuntu 18.04 për shpejtësinë e ndërtimit dhe madhësinë përfundimtare të imazhit.
Së pari, do të shkarkojmë dy imazhe dhe do të 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. Tani le të provojmë të instalojmë gcc dhe të 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-it ideal kalon jashtë kësaj 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ë, shikojmë kohën 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 premtuam, imazhet e bazuara në Alpine ndërtohen më shpejt dhe vetë janë më të vogla: 15 sekonda në vend të 30 dhe madhësia e imazhit është 105MB krahasuar me 150MB. Kjo është mjaft mirë!
Por nëse ne kthehemi në ndërtimin e një aplikacioni Python, gjërat nuk janë aq të bukura.
Imazhi Python
Aplikacionet Python shpesh përdorin pandas dhe matplotlib. Prandaj, një nga mundësitë është të merret imazhi zyrtar i bazuar në Debian, duke përdorur një Dockerfile të tillë:
FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas
E ndërtuam atë:
$ 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
Ne marrë një imazh me madhësi 363MB.
A do të na dalë më mirë me Alpine? Le të Provojmë:
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
ĂfarĂ« po ndodh?
Alpine nuk mbështet wheels
Nëse shikoni në ndërtimin që bazohet në Debian, do të shihni se ai 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` sepse ai nuk mbështet standardin .
Pse? Shumica e distribucioneve Linux përdorin versionin GNU (glibc) të bibliotekës standarde C, e cila në fakt është e nevojshme për çdo program të shkruar në C, duke përfshirë Python. Por Alpine përdor `musl`, dhe këta binarë janë për `glibc`, prandaj nuk janë një opsion.
Prandaj, nëse përdorni Alpine, ju nevojitet të kompiloni të gjithë kodin e shkruar në C, në çdo paketë Python.
Ah, po, lista e të gjitha atyre varësive që duhet të kompilohet do të duhet ta kërkoni vetë.
Në këtë rast, marrim kështu:
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
Dhe koha e ndĂ«rtimit zgjatâŠ
⊠25 minuta 57 sekonda! Dhe madhësia e imazhit është 851MB.
Imazhet që bazohen në Alpine ndërtohen shumë më gjatë, ato vetë janë më të mëdha dhe ju duhet gjithashtu të kërkoni të gjitha varësitë. Megjithatë, mund të zvogëloni madhësinë e ndërtimit duke përdorur por kjo do të thotë se duhet të bëni edhe më shumë punë.
Kjo nuk është e gjitha!
Alpine mund të jetë shkaku i defekteve të papritura në runtime
- Në teori, musl është kompatibil me glibc, por në praktikë, dallimet mund të shkaktojnë shumë probleme. Dhe nëse ndodhin, ato sigurisht që do të jenë të padëshirueshme. Ja disa probleme që mund të ndodhin:
- Alpine, me default, ka një madhësi më të vogël të stack-ut të thread-it, që mund të çojë në
- Disa përdorues kanë zbuluar se për shkak të mënyrës se si musl rezervon memorie (e ndryshme nga glibc).
- Një nga përdoruesit
Sigurisht që këto gabime janë rregulluar tashmë, por kush e di sa të tjera ka.
Mos përdorni imazhe Alpine për Python
NĂ«se nuk doni tĂ« mĂ«rziteni me ndĂ«rtimet e mĂ«dha dhe tĂ« gjata, kĂ«rkimin e varĂ«sive dhe gabimet potenciale â mos e pĂ«rdorni Alpine Linux si njĂ« imazh bazĂ«. .
Burimi: habr.com
