ืึทืœืคึผื™ื™ืŸ ืงืึทืžืคึผื™ื™ืœื– ื“ืึธืงืงืขืจ ื‘ื•ื™ืขืŸ ืคึฟืึทืจ ืคึผื™ื˜ื”ืึธืŸ 50 ืžืืœ ืกืœืึธื•ืขืจ, ืื•ืŸ ื‘ื™ืœื“ืขืจ ื–ืขื ืขืŸ 2 ืžืืœ ื›ืขื•ื•ื™ืขืจ

ืึทืœืคึผื™ื™ืŸ ืงืึทืžืคึผื™ื™ืœื– ื“ืึธืงืงืขืจ ื‘ื•ื™ืขืŸ ืคึฟืึทืจ ืคึผื™ื˜ื”ืึธืŸ 50 ืžืืœ ืกืœืึธื•ืขืจ, ืื•ืŸ ื‘ื™ืœื“ืขืจ ื–ืขื ืขืŸ 2 ืžืืœ ื›ืขื•ื•ื™ืขืจ

ืึทืœืคึผื™ื™ืŸ ืœื™ื ื•ืงืก ืื™ื– ืึธืคื˜ ืจืขืงืึทืžืขื ื“ื™ื“ ื•ื•ื™ ืึท ื‘ืึทื–ืข ื‘ื™ืœื“ ืคึฟืึทืจ ื“ืึธืงืขืจ. ืื™ืจ ื”ืึธื˜ ื’ืขื–ืึธื’ื˜ ืึทื– ื ื™ืฆืŸ ืึทืœืคึผื™ื™ืŸ ื•ื•ืขื˜ ืžืึทื›ืŸ ื“ื™ื™ืŸ ื‘ื•ื™ืขืŸ ืงืœืขื ืขืจืขืจ ืื•ืŸ ื“ื™ื™ืŸ ื‘ื•ื™ืขืŸ ืคึผืจืึธืฆืขืก ืคืึทืกื˜ืขืจ.

ืึธื‘ืขืจ ืื•ื™ื‘ ืื™ืจ ื ื•ืฆืŸ ืึทืœืคึผื™ื™ืŸ ืœื™ื ื•ืงืก ืคึฟืึทืจ ืคึผื™ื˜ื”ืึธืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ื“ืึธืก:

  • ืžืื›ื˜ ื“ื™ื™ืŸ ื‘ื•ื™ืขืŸ ืคื™ืœ ืกืœืึธื•ืขืจ
  • ืžืื›ื˜ ื“ื™ื™ืŸ ื‘ื™ืœื“ืขืจ ื‘ื™ื’ืขืจ
  • ื•ื•ื™ื™ืกื˜ื™ื ื’ ื“ื™ื™ืŸ ืฆื™ื™ื˜
  • ืื•ืŸ ืื™ืŸ ื“ื™ ืกื•ืฃ ืขืก ืงืขืŸ ืคืึทืจืฉืึทืคืŸ ืขืจืจืึธืจืก ืื™ืŸ ืจื•ื ื˜ื™ืžืข


ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื•ื•ืึธืก ืึทืœืคึผื™ื™ืŸ ืื™ื– ืจืขืงืึทืžืขื ื“ื™ื“, ืึธื‘ืขืจ ื•ื•ืึธืก ืื™ืจ ื ืึธืš ื–ืึธืœ ื ื™ืฉื˜ ื ื•ืฆืŸ ืขืก ืžื™ื˜ ืคึผื™ื˜ื”ืึธืŸ.

ืคืืจื•ื•ืืก ื˜ืึธืŸ ืžืขื ื˜ืฉืŸ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืึทืœืคึผื™ื™ืŸ?

ืœืึธืžื™ืจ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ืžื™ืจ ื“ืึทืจืคึฟืŸ ื’ืงืง ื•ื•ื™ ืึท ื˜ื™ื™ืœ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ืœื“ ืื•ืŸ ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืคืึทืจื’ืœื™ื™ึทื›ืŸ ืึทืœืคึผื™ื™ืŸ ืœื™ื ื•ืงืก ื•ื•ืก ื•ื‘ื•ื ื˜ื• 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/*

ืฉืจื™ื™ื‘ืŸ ื“ื™ ืฉืœื™ื™ืžืขืกื“ื™ืง Dockerfile ืื™ื– ื•ื•ื™ื™ึทื˜ืขืจ ืคื•ืŸ ื“ืขื ืคืึทืจื ืขื ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ.

ื–ืืœ ืก ืžืขืกื˜ืŸ ื“ื™ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ื’ื™ื›ืงื™ื™ึทื˜:

$ 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 ืื•ืŸ ื“ื™ ื‘ื™ืœื“ ื’ืจื™ื™ืก ืื™ื– 105 ืžื‘ ืงืขื’ืŸ 150 ืžื‘. ืขืก ืก ืฉื™ื™ืŸ ื’ื•ื˜!

ืึธื‘ืขืจ ืื•ื™ื‘ ืžื™ืจ ื‘ืึทืฉื˜ื™ืžืขืŸ ืฆื• ื‘ื•ื™ืขืŸ ืึท ืคึผื™ื˜ื”ืึธืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืึทืœืฅ ืื™ื– ื ื™ืฉื˜ ืึทื–ื•ื™ ืจืึธื–ืขื•ื•ืข.

ืคึผื™ื˜ื”ืึธืŸ ื‘ื™ืœื“

ืคึผื™ื˜ื”ืึธืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืึธืคื˜ ื ื•ืฆืŸ ืคึผืึทื ื“ืึทืก ืื•ืŸ ืžืึทื˜ืคึผืœืึธื˜ืœื™ื‘. ื“ืขืจื™ื‘ืขืจ, ืื™ื™ืŸ ืึธืคึผืฆื™ืข ืื™ื– ืฆื• ื ืขืžืขืŸ ื“ื™ ื‘ืึทืึทืžื˜ืขืจ ื“ืขื‘ื™ืึทืŸ-ื‘ืื–ื™ืจื˜ ื‘ื™ืœื“ ื ื™ืฆืŸ ื“ืขื ื“ืึธืงืงืขืจืคื™ืœืข:

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

ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืึท ื‘ื™ืœื“ ืคื•ืŸ 363 ืžื‘ ืื™ืŸ ื’ืจื™ื™ืก.
ื•ื•ืขืœืŸ ืžื™ืจ ื˜ืึธืŸ ื‘ืขืกืขืจ ืžื™ื˜ ืึทืœืคึผื™ื™ืŸ? ืœืืžื™ืจ ืคืจื•ื‘ื™ืจืŸ:

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` ื–ื™ื ื˜ ืขืก ืฉื˜ื™ืฆื˜ ื ื™ืฉื˜ ื ืึธืจืžืึทืœ ื›ื•ื•ื™ืœื–.

ืคืืจื•ื•ืืก? ืจื•ื‘ึฟ ืœื™ื ื•ืงืก ื“ื™ืกื˜ืจื™ื‘ื™ื•ืฉืึทื ื– ื ื•ืฆืŸ ื“ื™ GNU ื•ื•ืขืจืกื™ืข (glibc) ืคื•ืŸ ื“ื™ C ื ืึธืจืžืึทืœ ื‘ื™ื‘ืœื™ืึธื˜ืขืง, ื•ื•ืึธืก ืื™ื– ืื™ืŸ ืคืึทืงื˜ ืคืืจืœืื ื’ื˜ ื“ื•ืจืš ื™ืขื“ืขืจ ืคึผืจืึธื’ืจืึทื ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ C, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืคึผื™ื˜ื”ืึธืŸ. ืึธื‘ืขืจ ืึทืœืคึผื™ื™ืŸ ื ื™ืฆื˜ `musl`, ืื•ืŸ ื–ื™ื ื˜ ื“ื™ ื‘ื™ื ืึทืจื™ืขืก ื–ืขื ืขืŸ ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ `glibc`, ื–ื™ื™ ื–ืขื ืขืŸ ืคืฉื•ื˜ ื ื™ืฉื˜ ืึทืŸ ืึธืคึผืฆื™ืข.

ื“ืขืจื™ื‘ืขืจ, ืื•ื™ื‘ ืื™ืจ ื ื•ืฆืŸ ืึทืœืคึผื™ื™ืŸ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื–ืึทืžืœืขืŸ ืึทืœืข ืงืึธื“ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ 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 ืกืขืงื•ื ื“ืขืก! ืื•ืŸ ื“ื™ ื‘ื™ืœื“ ื’ืจื™ื™ืก ืื™ื– 851 ืžื‘.

ืึทืœืคึผื™ื™ืŸ-ื‘ืื–ื™ืจื˜ ื‘ื™ืœื“ืขืจ ื ืขืžืขืŸ ืคื™ืœ ืžืขืจ ืฆื• ื‘ื•ื™ืขืŸ, ื–ื™ื™ ื–ืขื ืขืŸ ื’ืจืขืกืขืจืข ืื™ืŸ ื’ืจื™ื™ืก, ืื•ืŸ ืื™ืจ ื ืึธืš ื“ืึทืจืคึฟืŸ ืฆื• ืงื•ืงืŸ ืคึฟืึทืจ ืึทืœืข ื“ื™ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–. ืื™ืจ ืงืขื ืขืŸ ืคื•ืŸ ืงื•ืจืก ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ื’ืจื™ื™ืก ื ื™ืฆืŸ ืžื•ืœื˜ื™-ื‘ื™ื ืข ื‘ื•ื™ืขืŸ ืึธื‘ืขืจ ื“ืึธืก ืžื™ื™ื ื˜ ืึทื– ื ืึธืš ืžืขืจ ืึทืจื‘ืขื˜ ื“ืึทืจืฃ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ.

ืึทื– ืก 'ื ื™ืฉื˜ ืึทืœืข!

ืึทืœืคึผื™ื™ืŸ ืงืขืŸ ืคืึทืจืฉืึทืคืŸ ืื•ืžื’ืขืจื™ื›ื˜ ื‘ืึทื’ื– ืื™ืŸ ืจื•ื ื˜ื™ืžืข

ืื•ื•ื“ืื™ ื–ืขื ืขืŸ ื“ื™ ื“ืื–ื™ื’ืข ื˜ืขื•ืชื™ื ืฉื•ื™ืŸ ืคืืจืจื™ื›ื˜ ื’ืขื•ื•ืืจืŸ, ืื‘ืขืจ ื•ื•ืขืจ ื•ื•ื™ื™ืกื˜ ื•ื•ื™ืคื™ืœ ื ืืš ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ.

ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ื ื•ืฆืŸ ืึทืœืคึผื™ื™ืŸ ื‘ื™ืœื“ืขืจ ืคึฟืึทืจ ืคึผื™ื˜ื”ืึธืŸ

ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ื ื™ืฉื˜ ื•ื•ืขืœืŸ ืฆื• ืึทืจืŸ ืžื™ื˜ ื’ืจื•ื™ืก ืื•ืŸ ืœืึทื ื’ ื‘ื•ื™ืขืŸ, ื–ื•ื›ืŸ ืคึฟืึทืจ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ืื•ืŸ ืคึผืึธื˜ืขื ืฆื™ืขืœ ืขืจืจืึธืจืก, ื˜ืึธืŸ ื ื™ื˜ ื ื•ืฆืŸ ืึทืœืคึผื™ื™ืŸ ืœื™ื ื•ืงืก ื•ื•ื™ ืึท ื‘ืึทื–ืข ื‘ื™ืœื“. ื˜ืฉืึธืึธืกื™ื ื’ ืึท ื’ื•ื˜ ื‘ืึทื–ืข ื‘ื™ืœื“.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’