Hoʻopili ʻo Alpine i nā hana Docker no Python 50 mau manawa lohi, a ʻo nā kiʻi he 2 mau manawa ke kaumaha

Hoʻopili ʻo Alpine i nā hana Docker no Python 50 mau manawa lohi, a ʻo nā kiʻi he 2 mau manawa ke kaumaha

Manaʻo pinepine ʻia ʻo Alpine Linux ma ke ʻano he kiʻi kumu no Docker. Ua ʻōlelo ʻia ʻo ka hoʻohana ʻana iā Alpine e liʻiliʻi i kāu mau hale a ʻoi aku ka wikiwiki o kāu kaʻina hana.

Akā inā ʻoe e hoʻohana iā Alpine Linux no nā noi Python, a laila:

  • Hoʻolōʻihi i kāu kūkulu ʻana
  • Hoʻonui i kāu mau kiʻi
  • Hoʻopau i kou manawa
  • A i ka hopena hiki ke hana hewa i ka runtime


E nānā kākou i ke kumu i ʻōlelo ʻia ai ʻo Alpine, akā no ke aha ʻoe e hoʻohana ʻole ai me Python.

No ke aha i makemake ai nā kānaka iā Alpine?

E noʻonoʻo mākou e pono mākou i ka gcc ma ke ʻano he ʻāpana o kā mākou kiʻi a makemake mākou e hoʻohālikelike iā Alpine Linux me Ubuntu 18.04 ma ke ʻano o ke kūkulu wikiwiki ʻana a me ka nui o ke kiʻi hope.

ʻO ka mua, e hoʻoiho i ʻelua kiʻi a hoʻohālikelike i ko lākou nui:

$ 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

E like me kāu e ʻike ai, ʻoi aku ka liʻiliʻi o ke kiʻi kumu no Alpine. E ho'āʻo kākou e hoʻokomo i ka gcc a hoʻomaka 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/*

ʻO ke kākau ʻana i ka Dockerfile maikaʻi loa ma waho o ke kiko o kēia ʻatikala.

E ana kāua i ka māmā holo hui:

$ 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

Hana hou mākou no ka Alpine (Dockerfile):

FROM alpine
RUN apk add --update gcc

Hoʻākoakoa mākou, e nānā i ka manawa a me ka nui o ka hui:

$ 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

E like me ka mea i hoʻohiki ʻia, ʻohi wikiwiki ʻia nā kiʻi ma Alpine a ʻoi aku ka liʻiliʻi: 15 kekona ma kahi o 30 a ʻo ka nui o ke kiʻi he 105MB me 150MB. Maikaʻi nō!

Akā inā e hoʻololi mākou i ke kūkulu ʻana i kahi noi Python, a laila ʻaʻole like nā mea āpau.

Kiʻi Python

Hoʻohana pinepine nā noi Python i nā pandas a me ka matplotlib. No laila, hoʻokahi koho e lawe i ke kiʻi hoʻokumu Debian me ka hoʻohana ʻana i kēia Dockerfile:

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

E ʻohi kākou:

$ 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

Loaʻa iā mākou kahi kiʻi o 363MB i ka nui.
E hana maikaʻi anei mākou me Alpine? E ho'āʻo kākou:

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

He aha ka mea e hana nei?

ʻAʻole kākoʻo ʻo Alpine i nā huila

Inā ʻoe e nānā i ke kūkulu ʻana, i hoʻokumu ʻia ma Debian, e ʻike ʻoe e hoʻoiho i ka matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

He binary kēia no ka huila. Hoʻoiho ʻo Alpine i nā kumu `matplotlib-3.1.2.tar.gzʻoiai ʻaʻole ia e kākoʻo i ka maʻamau huila.

No ke aha mai? Hoʻohana ka hapa nui o nā māhele Linux i ka mana GNU (glibc) o ka waihona maʻamau C, ʻo ia ka mea e koi ʻia e kēlā me kēia papahana i kākau ʻia ma C, me ka Python. Akā hoʻohana ʻo Alpine i ka 'musl', a no ka mea ua hoʻolālā ʻia kēlā mau binaries no 'glibc', ʻaʻole ia he koho.

No laila, inā ʻoe e hoʻohana iā Alpine, pono ʻoe e hōʻuluʻulu i nā code āpau i kākau ʻia ma C i kēlā me kēia pūʻulu Python.

ʻAe, pono ʻoe e ʻimi i ka papa inoa o nā mea hilinaʻi āpau e pono e hōʻuluʻulu iā ʻoe iho.
I kēia hihia, loaʻa iā mākou kēia:

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

A ʻo ka manawa o ke kūkulu ʻana e lawe ...

... 25 minuke 57 kekona! A ʻo 851MB ka nui o ke kiʻi.

ʻOi aku ka lōʻihi o ke kūkulu ʻana i nā kiʻi Alpine, ʻoi aku ka nui o ka nui, a pono ʻoe e ʻimi i nā mea hilinaʻi āpau. Hiki iā ʻoe ke hōʻemi i ka nui o ka hui me ka hoʻohana ʻana hana nui-pae akā, ʻo ia hoʻi, ʻoi aku ka nui o ka hana.

ʻAʻole wale kēlā!

Hiki i ka Alpine ke hoʻoulu i nā pōpoki i manaʻo ʻole ʻia i ka wā holo

  • Ma ke kumumanaʻo, kūpono ka musl me glibc, akā ma ka hoʻomaʻamaʻa hiki i nā ʻokoʻa ke kumu i nā pilikia he nui. A inā ʻo ia, e ʻoluʻolu paha lākou. Eia kekahi mau pilikia e hiki mai ana:
  • He liʻiliʻi ka nui o ka pae o Alpine, hiki ke alakaʻi i nā hewa ma Python
  • Ua ʻike kekahi mau mea hoʻohana ʻOi aku ka lohi o nā noi Python ma muli o ke ala e hoʻokaʻawale ai ka musl i ka hoʻomanaʻo (ʻokoʻa me glibc).
  • ʻO kekahi o nā mea hoʻohana ua loaʻa ka hewa i ka hoʻopololei ʻana i ka lā

ʻOiaʻiʻo, ua hoʻoponopono ʻia kēia mau hewa, akā ʻo wai ka mea ʻike i ka nui o nā mea hou aku.

Mai hoʻohana i nā kiʻi Alpine no Python

Inā ʻaʻole ʻoe makemake e hoʻopilikia i nā kūkulu nui a lōʻihi, e ʻimi ana i nā hilinaʻi a me nā hewa kūpono, mai hoʻohana iā Alpine Linux ma ke ʻano he kiʻi kumu. Ke koho ʻana i kahi kiʻi kumu maikaʻi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka