Alpine compiles Docker mbangun kanggo Python 50 kaping alon, lan gambar 2 kaping luwih abot

Alpine compiles Docker mbangun kanggo Python 50 kaping alon, lan gambar 2 kaping luwih abot

Alpine Linux asring dianjurake minangka gambar dhasar kanggo Docker. Sampeyan dikandhani yen nggunakake Alpine bakal nggawe bangunan luwih cilik lan proses mbangun luwih cepet.

Nanging yen sampeyan nggunakake Alpine Linux kanggo aplikasi Python, banjur:

  • Ndadekake mbangun sampeyan luwih alon
  • Nggawe gambar sampeyan luwih gedhe
  • Mbuang wektu
  • Lan ing pungkasan bisa nimbulakΓ© kasalahan ing runtime


Ayo kang katon ing apa Alpine dianjurake, nanging apa sampeyan isih ora kudu nggunakake karo Python.

Napa wong nyaranake Alpine?

Ayo nganggep manawa kita butuh gcc minangka bagean saka gambar kita lan kita pengin mbandhingake Alpine Linux vs Ubuntu 18.04 babagan kacepetan mbangun lan ukuran gambar pungkasan.

Pisanan, ayo ndownload rong gambar lan mbandhingake ukurane:

$ 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

Minangka sampeyan bisa ndeleng, gambar dhasar kanggo Alpine luwih cilik. Ayo saiki nyoba nginstal gcc lan miwiti karo 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/*

Nulis Dockerfile sing sampurna ngluwihi ruang lingkup artikel iki.

Ayo ngukur kacepetan perakitan:

$ 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

Baleni maneh kanggo Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Kita ngumpul, ndeleng wektu lan ukuran perakitan:

$ 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

Kaya sing dijanjekake, gambar adhedhasar Alpine diklumpukake luwih cepet lan luwih cilik: 15 detik tinimbang 30 lan ukuran gambar 105MB lawan 150MB. Iku cukup apik!

Nanging yen kita ngalih kanggo mbangun aplikasi Python, banjur kabeh ora dadi rosy.

Gambar Python

Aplikasi Python asring nggunakake panda lan matplotlib. Mula, salah sawijining pilihan yaiku njupuk gambar berbasis Debian resmi nggunakake Dockerfile iki:

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

Ayo ngumpulake:

$ 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

Kita entuk gambar ukuran 363MB.
Apa kita bakal luwih apik karo Alpine? Ayo jajal:

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

Apa sing kelakon?

Alpine ora ndhukung gembong

Yen katon ing mbangun, kang adhedhasar Debian, sampeyan bakal weruh sing download matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Iki minangka binar kanggo wheel . Alpine ngundhuh sumber `matplotlib-3.1.2.tar.gz` amarga ora ndhukung standar gembong.

Kenging punapa? Umume distribusi Linux nggunakake versi GNU (glibc) saka perpustakaan standar C, sing sejatine dibutuhake saben program sing ditulis ing C, kalebu Python. Nanging Alpine nggunakake `musl`, lan amarga binari kasebut dirancang kanggo `glibc`, mula ora dadi pilihan.

Mulane, yen sampeyan nggunakake Alpine, sampeyan kudu ngumpulake kabeh kode sing ditulis ing C ing saben paket Python.

Oh, ya, sampeyan kudu nggoleki dhaptar kabeh dependensi sing kudu dikompilasi dhewe.
Ing kasus iki, kita entuk iki:

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

Lan wektu mbangun njupuk ...

... 25 menit 57 detik! Lan ukuran gambar 851MB.

Gambar adhedhasar Alpine mbutuhake wektu luwih suwe kanggo mbangun, ukurane luwih gedhe, lan sampeyan isih kudu nggoleki kabeh dependensi. Sampeyan bisa mesthi nyuda ukuran DΓ©wan nggunakake mbangun multi-tataran nanging tegese luwih akeh karya sing kudu ditindakake.

Ora mung kuwi!

Alpine bisa nyebabake bug sing ora dikarepke nalika runtime

  • Ing teori, musl kompatibel karo glibc, nanging ing laku beda bisa nimbulakΓ© akeh masalah. Lan yen padha, mesthine bakal ora nyenengake. Ing ngisor iki sawetara masalah sing bisa kedadeyan:
  • Alpine nduweni ukuran tumpukan benang sing luwih cilik kanthi standar, sing bisa nyebabake kasalahan ing Python
  • Sawetara kedhaftar wis ketemu sing Aplikasi Python luwih alon amarga cara musl ngalokasi memori (beda karo glibc).
  • Salah sawijining pangguna nemokake kesalahan nalika ngowahi format tanggal

Mesthine kesalahan kasebut wis didandani, nanging sapa ngerti bakal ana maneh.

Aja nggunakake gambar Alpine kanggo Python

Yen sampeyan ora pengin ngganggu mbangun gedhe lan dawa, nggoleki dependensi lan kesalahan potensial, aja nggunakake Alpine Linux minangka gambar dhasar. Milih gambar dhasar sing apik.

Source: www.habr.com

Add a comment