Alpine builds Docker builds per Python 50x più lento è l'imaghjini 2x più pesanti

Alpine builds Docker builds per Python 50x più lento è l'imaghjini 2x più pesanti

Alpine Linux hè spessu cunsigliatu cum'è una maghjina di basa per Docker. Vi hè dettu chì l'usu di Alpine farà e vostre custruzzioni più chjuche è u vostru prucessu di creazione più veloce.

Ma se utilizate Alpine Linux per l'applicazioni Python, allora:

  • Rende e vostre custruzzioni assai più lente
  • Rende e vostre imagine più grande
  • Perde u vostru tempu
  • È à a fine pò causà errori in runtime


Fighjemu perchè Alpine hè cunsigliatu, ma perchè ùn avete micca sempre aduprà cù Python.

Perchè a ghjente ricumandemu Alpine?

Assumimu chì avemu bisognu di gcc cum'è parte di a nostra maghjina è vulemu paragunà Alpine Linux vs Ubuntu 18.04 in quantu à a velocità di creazione è a dimensione finale di l'imagine.

Prima, scarichemu duie imagine è paragunemu e so dimensioni:

$ 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

Comu pudete vede, l'imaghjini di basa per Alpine hè assai più chjuca. Pruvemu avà di stallà gcc è cuminciamu cù 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/*

Scrivite u Dockerfile perfettu hè fora di u scopu di stu articulu.

Misuremu a velocità di l'assemblea:

$ 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

Ripetemu u listessu per Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Assemblamu, fighjemu u tempu è a dimensione di l'assemblea:

$ 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

Cum'è prumessu, l'imaghjini basati in Alpi sò cullati più veloce è sò più chjuchi: 15 seconde invece di 30 è a dimensione di l'imaghjini hè 105MB versus 150MB. Hè bellu bè !

Ma se cambiamu à custruisce una applicazione Python, allora tuttu ùn hè micca cusì rosa.

L'imaghjini di Python

L'applicazioni Python spessu usanu pandas è matplotlib. Dunque, una opzione hè di piglià l'imagine ufficiale basata in Debian utilizendu stu Dockerfile:

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

Raccogliemu :

$ 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

Avemu una maghjina di 363MB in taglia.
Faremu megliu cù Alpine ? Pruvemu:

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

Cosa succede

Alpine ùn sustene micca e roti

Se guardate a custruzione, chì hè basatu annantu à Debian, vi vede chì scarica matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Questu hè un binariu per a rota. Alpine scarica i fonti `matplotlib-3.1.2.tar.gz` postu chì ùn sustene micca standard roti.

Perchè? A maiò parte di e distribuzioni Linux utilizanu a versione GNU (glibc) di a libreria standard C, chì hè in fatti necessaria da ogni prugramma scrittu in C, cumpresu Python. Ma Alpine usa "musl", è postu chì quelli binari sò pensati per "glibc", ùn sò micca solu una opzione.

Dunque, se utilizate Alpine, avete bisognu di cumpilà tuttu u codice scrittu in C in ogni pacchettu Python.

Oh, iè, vi tuccherà à circà a lista di tutti tali dependenzii chì deve esse compilatu sè stessu.
In questu casu avemu questu:

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

È u tempu di custruzzione piglia ...

... 25 minuti 57 seconde ! È a dimensione di l'imagine hè 851 MB.

L'imaghjini basati in l'Alpi pigghianu assai più tempu per custruisce, sò più grande in grandezza, è avete sempre bisognu di circà tutte e dipendenze. Pudete di sicuru riduce a dimensione di l'assemblea usendu costruzioni in più fasi ma questu significa ancu più travagliu deve esse fattu.

Ùn hè micca tuttu!

Alpine pò causà bug inespettati in runtime

  • In teoria, musl hè cumpatibile cù glibc, ma in a pratica i diffirenzi pò causà assai prublemi. È s'ellu sò, seranu prubabilmente dispiacenti. Eccu alcuni prublemi chì ponu accade:
  • Alpine hà una dimensione di stack di filu più chjuca per difettu, chì pò purtà à errori in Python
  • Certi utilizatori anu trovu chì L'applicazioni Python sò più lente per via di a manera chì musl attribuisce a memoria (differente da glibc).
  • Unu di l'utilizatori truvò un errore durante u furmatu di a data

Di sicuru, sti errori sò digià curretti, ma chì sà quanti più ci saranu.

Ùn aduprate micca l'imagine Alpine per Python

Se ùn vulete micca fastidiu cù custruzzioni grandi è longu, cercandu dipendenze è errori potenziali, ùn utilizate micca Alpine Linux cum'è una maghjina di basa. Sceglite una bona maghjina di basa.

Source: www.habr.com

Add a comment