
Alpine Linux â shpesh rekomandohet si njĂ« imazh bazĂ« pĂ«r Docker. Ju thonĂ« se pĂ«rdorimi i Alpine do ta bĂ«jĂ« ndĂ«rtimin tuaj mĂ« tĂ« vogĂ«l dhe procesin e ndĂ«rtimit mĂ« tĂ« shpejtĂ«.
Por nëse po përdorni Alpine Linux për aplikacionet Python, atëherë ai:
- E bën ndërtimin tuaj shumë më të ngadalshëm
- E bën imazhin tuaj më të madh
- E humb kohën tuaj
- Dhe përfundimisht mund të bëhet shkak për gabime në kohën e ekzekutimit
Le të shqyrtojmë pse rekomandohet Alpine, por pse ju 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 duam të krahasojmë Alpine Linux me Ubuntu 18.04, për shpejtësinë e ndërtimit dhe madhësinë përfundimtare të imazhit.
Për fillim, ngarkohet dy imazhe dhe 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. Le të provojmë tani të instalojmë gcc dhe 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 ideale tejkalon qëllimin e këtij 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ë, shohim se sa merr koha 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 premtova, imazhet bazë Alpine ndërtohen më shpejt dhe janë më të vogla: 15 sekonda në vend të 30 dhe madhësia e imazhit 105MB kundrejt 150MB. Kjo është mjaft e mirë!
Por nëse kalojmë në ndërtimin e një aplikacioni Python, atëherë gjithçka nuk është kaq rozë.
Imazhi Python
Aplikacionet Python shpesh përdorin pandas dhe matplotlib. Prandaj, një nga opsionet është të marrësh imazhin zyrtar bazuar në Debian, duke përdorur një Dockerfile të tillë:
FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas
Ndërtojmë atë:
$ docker build -f Dockerfile.slim -t python-matpan.
Dërgimi i kontekstit të ndërtimit në daemon-in Docker 3.072kB
Hapi 1/2 : NGA python:3.8-slim
---> 036ea1506a85
Hapi 2/2 : RUN pip install --no-cache-dir matplotlib pandas
---> Po ekzekutohet në 13739b2a0917
Krahason matplotlib
Duke shkarkuar matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl (13.1 MB)
Krahason pandas
Duke shkarkuar pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4 MB)
...
Ndërtimi përfundoi me sukses b98b5dc06690
Etiketa përfundimtare python-matpan:latest
real 0m30.297s
user 0m0.043s
sys 0m0.020s
Po marrim një imazh me madhësi 363MB.
A do na dalë më mirë me Alpine? Le ta provojmë:
NGA python:3.8-alpine
RUN pip install --no-cache-dir matplotlib pandas
$ docker build -t python-matpan-alpine -f Dockerfile.alpine .
Dërgimi i kontekstit të ndërtimit në daemon-in Docker 3.072kB
Hapi 1/2 : NGA python:3.8-alpine
---> a0ee0c90a0db
Hapi 2/2 : RUN pip install --no-cache-dir matplotlib pandas
---> Po ekzekutohet në 6740adad3729
Krahason matplotlib
Duke shkarkuar matplotlib-3.1.2.tar.gz (40.9 MB)
ERROR: Komanda dështoi me statusin dalës 1:
komanda: \/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: Komanda dështoi me statusin dalës 1: python setup.py egg_info Shikoni logët për rezultate të plota të komandës.
Komanda '\/bin\/sh -c pip install matplotlib pandas' solli një kod jo zero: 1
ĂfarĂ« po ndodh?
Alpine nuk mbështet wheels
Nëse shikoni ndërtimin që bazohet në Debian, do të vini re se 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`, pasi ai nuk mbështet standardin .
Pse? Shumica e shpërndarjeve Linux përdorin versionin GNU (glibc) të bibliotekës standarde C, e cila është e nevojshme për çdo program të shkruar në C, duke përfshirë Python. Por Alpine përdor `musl`, dhe pasi ato binarë janë të destinuar për `glibc`, ata thjesht nuk funksionojnë.
Prandaj, nëse përdorni Alpine, ju duhet të kompiloni të gjithë kodin e shkruar në C në çdo paketë Python.
Ah, po, lista e të gjitha varësive të tilla që duhet të kompiloni do t'ju duhet ta kërkoni vetë.
Në këtë rast, kemi diçka të tillë:
NGA 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 merr...
⊠25 minuta 57 sekonda! Ndërsa madhësia e imazhit është 851MB.
Imazhet bazuar në Alpine mblidhen shumë më gjatë, vetë ata janë të mëdha dhe ju gjithashtu duhet të kërkoni të gjitha varësitë. Natyrisht, mund të zvogëloni madhësinë e ndërtimit duke përdorur por kjo do të thotë se duhet të punoni edhe më shumë.
Kjo nuk është gjithçka!
Alpine mund të jetë shkaku i defekteve të papritura gjatë ekzekutimit
- Në teori, musl është i përputhshëm me glibc, por në praktikë, ndryshimet mund të shkaktojnë shumë probleme. Dhe nëse ndodhin, ato sigurisht që do të jenë të pakëndshme. Ja disa probleme që mund të ndodhin:
- Alpine, sipas të dhënave, ka madhësi më të vogël të stack-ut të thread-it, gjë që mund të çojë në
- Disa përdorues kanë zbuluar se për shkak të mënyrës se si, musl alokton memorie (nuk është e njëjtë me glibc).
- Një nga përdoruesit
Sigurisht, këto gabime tashmë janë rregulluar, por kush e di sa shumë janë ende.
Mos përdorni imazhe Alpine për Python
NĂ«se nuk dĂ«shironi tĂ« merreni me ndĂ«rtime tĂ« mĂ«dha dhe tĂ« gjata, kĂ«rkimin e varĂ«sive dhe gabime tĂ« mundshme â mos pĂ«rdorni Alpine Linux si imazh bazĂ«. .
Burimi: habr.com
