Alpine Linux β ΡΠ°ΡΡΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· Π΄Π»Ρ Docker`Π°. ΠΠ°ΠΌ Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Alpine ΡΠ΄Π΅Π»Π°Π΅Ρ Π²Π°ΡΠΈ Π±ΠΈΠ»Π΄Ρ ΠΌΠ΅Π½ΡΡΠ΅, Π° ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ Π±ΡΡΡΡΠ΅ΠΉ.
ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Alpine Linux Π΄Π»Ρ Python ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΠΎ ΠΎΠ½:
- ΠΠ΅Π»Π°Π΅Ρ Π²Π°ΡΠΈ Π±ΠΈΠ»Π΄Ρ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅ΠΉ
- ΠΠ΅Π»Π°Π΅Ρ Π²Π°ΡΠΈ ΠΎΠ±ΡΠ°Π·Ρ Π±ΠΎΠ»ΡΡΠ΅
- Π’ΡΠ°ΡΠΈΡ Π²Π°ΡΠ΅ Π²ΡΠ΅ΠΌΡ
- Π Π² ΠΈΡΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΎΠΊ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΡΠ΅ΠΌΡ ΠΆΠ΅ Alpine ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ, Π½ΠΎ ΠΏΠΎΡΠ΅ΠΌΡ Π²Π°ΠΌ Π²ΡΠ΅ ΠΆΠ΅ Π½Π΅ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΠΌΠ΅ΡΡΠ΅ Ρ Python.
ΠΠΎΡΠ΅ΠΌΡ Π»ΡΠ΄ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ Alpine?
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ gcc ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π° ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΡΠ°Π²Π½ΠΈΡΡ Alpine Linux vs Ubuntu 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
ΠΠ°ΠΊ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· Π΄Π»Ρ Alpine Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ gcc ΠΈ Π½Π°ΡΠ½Π΅ΠΌ Ρ 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/*
ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΡ 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
ΠΠΎΠ²ΡΠΎΡΡΠ΅ΠΌ Π²ΡΠ΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π΄Π»Ρ Alpine (Dockerfile):
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
ΠΠ°ΠΊ ΠΈ ΠΎΠ±Π΅ΡΠ°Π½ΠΎ, ΠΎΠ±ΡΠ°Π·Ρ Π½Π° Π±Π°Π·Π΅ Alpine ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ Π±ΡΡΡΡΠ΅ΠΉ ΠΈ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΌΠ΅Π½ΡΡΠ΅: 15 ΡΠ΅ΠΊΡΠ½Π΄Π° Π²ΠΌΠ΅ΡΡΠΎ 30 ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π·Π° 105MB ΠΏΡΠΎΡΠΈΠ² 150MB. ΠΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ!
ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠΌΡΡ Π½Π° ΡΠ±ΠΎΡΠΊΡ Python ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΎ Π²ΡΠ΅ Π½Π΅ ΡΠ°ΠΊ ΡΠ°Π΄ΡΠΆΠ½ΠΎ.
Python ΠΎΠ±ΡΠ°Π·
Python ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ pandas ΠΈ matplotlib. ΠΠΎΡΡΠΎΠΌΡ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π²Π·ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π· Π½Π° Π±Π°Π·Π΅ Debian, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΠΎΠΉ Dockerfile:
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.
ΠΠΎΠ»ΡΡΠΈΡΡΡ Ρ Π½Π°Ρ Π»ΡΡΡΠ΅ Ρ Alpine? ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ:
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
Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ?
Alpine Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ wheels
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π±ΠΈΠ»Π΄, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π°Π·ΠΈΡΡΠ΅ΡΡΡ Π½Π° Debian, ΡΠΎ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΎΠ½ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.
ΠΡΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ Π΄Π»Ρ wheel. Alpine ΠΆΠ΅ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ `matplotlib-3.1.2.tar.gz`, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ
ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Linux Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ GNU Π²Π΅ΡΡΠΈΡ (glibc) ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ C, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ ΡΠ°ΠΊΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π½Π° C, Π²ΠΊΠ»ΡΡΠ°Ρ Python. ΠΠΎ Alpine ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ `musl`, Π° ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ `glibc`, ΠΎΠ½ΠΈ ΠΏΠΎΠΏΡΠΎΡΡΡ Π½Π΅ Π²Π°ΡΠΈΠ°Π½Ρ.
ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Alpine, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π²Π΅ΡΡ ΠΊΠΎΠ΄, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° C, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ Python.
ΠΡ
, Π΄Π°, ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
ΡΠ°ΠΊΠΈΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΊΠΎΡΠΎΡΡΠ΅, Π½ΡΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΊΠ°ΡΡ ΡΠ°ΠΌΠΈΠΌ.
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΊΠΎΠ΅:
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.
ΠΠ±ΡΠ°Π·Ρ Π½Π° Π±Π°Π·Π΅ Alpine ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΡΡΠ΅, ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΎΠ½ΠΈ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈ Π²Π°ΠΌ Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
ΠΡΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΡΠ΅!
Alpine ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ Π±Π°Π³ΠΎΠ² Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅
- Π ΡΠ΅ΠΎΡΠΈΠΈ musl ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ glibc, Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΌΠΎΠ³ΡΡ ΡΡΠ°ΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ, ΡΠΎ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° Π½Π΅ΠΏΡΠΈΡΠ½ΡΠ΅. ΠΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ:
- Alpine ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅Π½ΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠ΅ΠΊΠ° ΠΏΠΎΡΠΎΠΊΠ°, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ
ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ Π² Python - ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ
Python ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅ΠΉ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ, musl Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ (ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ glibc). - ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π°ΡΡ
ΠΠ°Π²Π΅ΡΠ½ΡΠΊΠ° ΡΡΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠΆΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΠ»ΠΈ, Π½ΠΎ ΠΊΡΠΎ Π·Π½Π°Π΅Ρ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡ Π΅ΡΠ΅.
ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ Alpine Π΄Π»Ρ Python
ΠΡΠ»ΠΈ Π½Π΅ Ρ
ΠΎΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΈΡΡΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΈ Π΄ΠΎΠ»Π³ΠΈΠΌΠΈ Π±ΠΈΠ»Π΄Π°ΠΌΠΈ, ΠΏΠΎΠΈΡΠΊΠΎΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ β Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Alpine Linux Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com