рдбреЙрдХрд░рд╕рд╛рдареА рдмреЗрд╕ рдЗрдореЗрдЬ рдореНрд╣рдгреВрди рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕рдЪреА рдЕрдиреЗрдХрджрд╛ рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реА рдЬрд╛рддреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рддреЗ рдХреА рдЕрд▓реНрдкрд╛рдЗрди рд╡рд╛рдкрд░рд▓реНрдпрд╛рдиреЗ рддреБрдордЪреА рдмрд┐рд▓реНрдб рд▓рд╣рд╛рди рд╣реЛрдИрд▓ рдЖрдгрд┐ рддреБрдордЪреА рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд▓рдж рд╣реЛрдИрд▓.
рдкрд░рдВрддреБ рдЬрд░ рддреБрдореНрд╣реА рдкрд╛рдпрдерди рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рд╡рд╛рдкрд░рдд рдЕрд╕рд╛рд▓ рддрд░ рддреЗ:
- рддреБрдордЪреЗ рдмрд┐рд▓реНрдб рдЦреВрдк рд╣рд│реВ рдХрд░рддреЗ
- рддреБрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдорд╛ рдореЛрдареНрдпрд╛ рдмрдирд╡рддреЗ
- рдЖрдкрд▓рд╛ рд╡реЗрд│ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡рдгреЗ
- рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рдпрд╛рдореБрд│реЗ рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рддреНрд░реБрдЯреА рдпреЗрдК рд╢рдХрддрд╛рдд
рдЕрд▓реНрдкрд╛рдЗрдирдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ рддреЗ рдкрд╛рд╣реВрдпрд╛, рдкрд░рдВрддреБ рддрд░реАрд╣реА рдЖрдкрдг рддреЗ рдкрд╛рдпрдердирд╕рд╣ рдХрд╛ рд╡рд╛рдкрд░реВ рдирдпреЗ.
рд▓реЛрдХ рдЕрд▓реНрдкрд╛рдЗрдирдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд╛ рдХрд░рддрд╛рдд?
рдЪрд▓рд╛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░реВ рдХреА рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди gcc рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдмрд┐рд▓реНрдб рдЧрддреА рдЖрдгрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдорд╛ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рд╡рд┐ рдЙрдмрдВрдЯреВ 18.04 рдЪреА рддреБрд▓рдирд╛ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗ.
рдкреНрд░рдердо, рджреЛрди рдкреНрд░рддрд┐рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░реВрдпрд╛:
$ 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
рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рдЕрд▓реНрдкрд╛рдЗрдирдЪреА рдореВрд│ рдкреНрд░рддрд┐рдорд╛ рдЦреВрдкрдЪ рд▓рд╣рд╛рди рдЖрд╣реЗ. рдЪрд▓рд╛ рдЖрддрд╛ gcc рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ рдЖрдгрд┐ рдЙрдмрдВрдЯреВрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛:
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/*
рдкрд░рд┐рдкреВрд░реНрдг рдбреЙрдХрд░рдлрд╛рдЗрд▓ рд▓рд┐рд╣рд┐рдгреЗ рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╡реНрдпрд╛рдкреНрддреАрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЖрд╣реЗ.
рдЪрд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реАрдЪрд╛ рд╡реЗрдЧ рдореЛрдЬреВрдпрд╛:
$ 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
рдЖрдореНрд╣реА рдЕрд▓реНрдкрд╛рдЗрди (рдбреЙрдХрд░рдлрд╛рдЗрд▓) рд╕рд╛рдареА рддреЗрдЪ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рддреЛ:
FROM alpine
RUN apk add --update gcc
рдЖрдореНрд╣реА рдПрдХрддреНрд░ рдХрд░рддреЛ, рдЕрд╕реЗрдВрдмреНрд▓реАрдЪреА рд╡реЗрд│ рдЖрдгрд┐ рдЖрдХрд╛рд░ рдкрд╣рд╛:
$ 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
рд╡рдЪрди рджрд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдорд╛ рдЬрд▓рдж рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛ рд▓рд╣рд╛рди рдЕрд╕рддрд╛рдд: 15 рдРрд╡рдЬреА 30 рд╕реЗрдХрдВрдж рдЖрдгрд┐ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдЖрдХрд╛рд░ 105MB рд╡рд┐рд░реБрджреНрдз 150MB рдЖрд╣реЗ. рд╣реЗ рдЦреВрдкрдЪ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ!
рдкрд░рдВрддреБ рдЬрд░ рдЖрдкрдг рдкрд╛рдпрдерди рдНрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрд╡рд┐рдЪ рдХреЗрд▓реЗ рддрд░ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЗрддрдХреЗ рдЧреБрд▓рд╛рдмреА рдирд╛рд╣реА.
рдкрд╛рдпрдерди рдкреНрд░рддрд┐рдорд╛
рдкрд╛рдпрдерди рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЕрдиреЗрдХрджрд╛ рдкрд╛рдВрдбрд╛ рдЖрдгрд┐ рдореЕрдЯрдкреНрд▓реЙрдЯрд▓рд┐рдм рд╡рд╛рдкрд░рддрд╛рдд. рдореНрд╣рдгреВрди, рдпрд╛ рдбреЙрдХрд░рдлрд╛рдЗрд▓рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдЕрдзрд┐рдХреГрдд рдбреЗрдмрд┐рдпрди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдорд╛ рдШреЗрдгреЗ рд╣рд╛ рдПрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗ:
FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas
рдЪрд▓рд╛ рддреЗ рдЧреЛрд│рд╛ рдХрд░реВрдпрд╛:
$ 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
рдЖрдореНрд╣рд╛рд▓рд╛ 363MB рдЖрдХрд╛рд░рд╛рдЪреА рдкреНрд░рддрд┐рдорд╛ рдорд┐рд│рддреЗ.
рдЖрдореНрд╣реА рдЕрд▓реНрдкрд╛рдЗрди рд╕рд╣ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░реВ? рдЪрд▓рд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ:
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
рдХрд╛рдп рдЪрд╛рд▓рд▓рдп?
рдЕрд▓реНрдкрд╛рдЗрди рдЪрд╛рдХрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА
рддреБрдореНрд╣реА рдбреЗрдмрд┐рдпрдирд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдмрд┐рд▓реНрдб рдкрд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕реЗрд▓ рдХреА рддреЗ matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ.whl.
рд╣реЗ рдЪрд╛рдХрд╛рд╕рд╛рдареА рдмрд╛рдпрдирд░реА рдЖрд╣реЗ. рдЕрд▓реНрдкрд╛рдЗрди рд╕реНрд░реЛрдд `matplotlib-3.1.2.tar рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ.gz` рдХрд╛рд░рдг рддреЗ рдорд╛рдирдХрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА
рдХрд╛? рдмрд╣реБрддреЗрдХ Linux рд╡рд┐рддрд░рдгреЗ C рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреА GNU рдЖрд╡реГрддреНрддреА (glibc) рд╡рд╛рдкрд░рддрд╛рдд, рдЬреА рдХрд┐рдВрдмрд╣реБрдирд╛ рдкрд╛рдпрдердирд╕рд╣ C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ. рдкрдг рдЕрд▓реНрдкрд╛рдЗрди `musl` рд╡рд╛рдкрд░рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛ рдмрд╛рдпрдирд░реА `glibc` рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреНрдпрд╛рдВрдирд╛ рдкрд░реНрдпрд╛рдп рдирд╛рд╣реА.
рдореНрд╣рдгреВрди, рддреБрдореНрд╣реА рдЕрд▓реНрдкрд╛рдЗрди рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ Python рдкреЕрдХреЗрдЬрдордзреНрдпреЗ C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓.
рдЕрд░реЗ, рд╣реЛрдп, рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╢рд╛ рд╕рд░реНрд╡ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдЪреА рдпрд╛рджреА рд╢реЛрдзрд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЬреНрдпрд╛рдВрдирд╛ рд╕реНрд╡рддрдГ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдорд┐рд│рддреЗ:
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
рдЖрдгрд┐ рдмрд╛рдВрдзрд╛рдпрд▓рд╛ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ...
... 25 рдорд┐рдирд┐рдЯреЗ 57 рд╕реЗрдХрдВрдж! рдЖрдгрд┐ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдЖрдХрд╛рд░ 851MB рдЖрд╣реЗ.
рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрд╛рд╕реНрдд рд╡реЗрд│ рд▓рд╛рдЧрддреЛ, рддреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдиреЗ рдореЛрдареНрдпрд╛ рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддрд░реАрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡ рдЕрд╡рд▓рдВрдмрди рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ. рдЖрдкрдг рдЕрд░реНрдерд╛рддрдЪ рд╡рд╛рдкрд░реВрди рдЕрд╕реЗрдВрдмрд▓реА рдЖрдХрд╛рд░ рдХрдореА рдХрд░реВ рд╢рдХрддрд╛
рдПрд╡рдвреЗрдЪ рдирд╛рд╣реА!
рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рдЕрд▓реНрдкрд╛рдЗрдирдореБрд│реЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдмрдЧ рд╣реЛрдК рд╢рдХрддрд╛рдд
- рд╕рд┐рджреНрдзрд╛рдВрддрддрдГ, musl glibc рд╢реА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдлрд░рдХ рдЕрдиреЗрдХ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВ рд╢рдХрддрд╛рдд. рдЖрдгрд┐ рдЬрд░ рддреЗ рдЕрд╕рддреАрд▓ рддрд░ рддреЗ рдХрджрд╛рдЪрд┐рдд рдЕрдкреНрд░рд┐рдп рдЕрд╕рддреАрд▓. рдпреЗрдереЗ рдХрд╛рд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡реВ рд╢рдХрддрд╛рдд:
- рдЕрд▓реНрдкрд╛рдЗрдирдордзреНрдпреЗ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рд▓рд╣рд╛рди рдереНрд░реЗрдб рд╕реНрдЯреЕрдХ рдЖрдХрд╛рд░ рдЕрд╕рддреЛ, рдЬреНрдпрд╛рдореБрд│реЗ рд╣реЛрдК рд╢рдХрддреЗ
рдкрд╛рдпрдердирдордзреАрд▓ рддреНрд░реБрдЯреА - рдХрд╛рд╣реА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдЕрд╕реЗ рдЖрдврд│рд▓реЗ рдЖрд╣реЗ
Python рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣рд│реВ рдЖрд╣реЗрдд рдореБрд╕рд▓ рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдореБрд│реЗ (glibc рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│реА). - рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдкреИрдХреА рдПрдХ
рддрд╛рд░реАрдЦ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рддрд╛рдирд╛ рддреНрд░реБрдЯреА рдЖрдврд│рд▓реА
рдпрд╛ рдЪреБрдХрд╛ рдирдХреНрдХреАрдЪ рд╕реБрдзрд╛рд░рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, рдкрдг рдЕрдЬреВрди рдХрд┐рддреА рдЕрд╕рддреАрд▓ рдХреЛрдгрд╛рд╕ рдард╛рдКрдХ.
Python рд╕рд╛рдареА рдЕрд▓реНрдкрд╛рдЗрди рдкреНрд░рддрд┐рдорд╛ рд╡рд╛рдкрд░реВ рдирдХрд╛
рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдореЛрдареНрдпрд╛ рдЖрдгрд┐ рд▓рд╛рдВрдмрд▓рдЪрдХ рдмрд┐рд▓реНрдбрдЪрд╛ рддреНрд░рд╛рд╕ рдШреНрдпрд╛рдпрдЪрд╛ рдирд╕реЗрд▓, рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЖрдгрд┐ рд╕рдВрднрд╛рд╡реНрдп рддреНрд░реБрдЯреАрдВрдЪрд╛ рд╢реЛрдз рдШреНрдпрд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓, рддрд░ рдмреЗрд╕ рдЗрдореЗрдЬ рдореНрд╣рдгреВрди рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рд╡рд╛рдкрд░реВ рдирдХрд╛.
рд╕реНрддреНрд░реЛрдд: www.habr.com