Alpine ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Docker ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Π·Π° Python 50 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ ΠΈ изобраТСнията 2 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Ρ‚Π΅ΠΆΠΊΠΈ

Alpine ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Docker ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Π·Π° Python 50 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ ΠΈ изобраТСнията 2 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Ρ‚Π΅ΠΆΠΊΠΈ

Alpine Linux чСсто сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° ΠΊΠ°Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Docker. ΠšΠ°Π·Π²Π°Ρ‚ Π²ΠΈ, Ρ‡Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Alpine Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΠΈΡ‚Π΅ Π²ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° компилация Ρ‰Π΅ станС ΠΏΠΎ-Π±ΡŠΡ€Π·.

Но Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Alpine Linux Π·Π° прилоТСния Π½Π° Python, Ρ‚ΠΎΠ³Π°Π²Π° Ρ‚ΠΎΠ²Π°:

  • ΠŸΡ€Π°Π²ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΠΈΡ‚Π΅ Π²ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±Π°Π²Π½ΠΈ
  • ΠŸΡ€Π°Π²ΠΈ Π²Π°ΡˆΠΈΡ‚Π΅ изобраТСния ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ
  • Π“ΡƒΠ±ΠΈΡˆ си Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ
  • И Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС


НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π·Π°Ρ‰ΠΎ Alpine сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°, Π½ΠΎ Π·Π°Ρ‰ΠΎ всС ΠΏΠ°ΠΊ Π½Π΅ трябва Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ с Python.

Π—Π°Ρ‰ΠΎ Ρ…ΠΎΡ€Π°Ρ‚Π° ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°Ρ‚ Alpine?

Π”Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ΠΌ, Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ gcc ΠΊΠ°Ρ‚ΠΎ част ΠΎΡ‚ нашия ΠΎΠ±Ρ€Π°Π· ΠΈ искамС Π΄Π° сравним Alpine Linux срСщу 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 Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΊΠΎΠ»Π΅Π»Π°

Ако ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ компилацията, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Debian, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Π΅ тя изтСгля matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.

Π’ΠΎΠ²Π° Π΅ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° ΠΊΠΎΠ»Π΅Π»ΠΎ. 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 ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π½Π΅ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС

  • На тСория musl Π΅ ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌ с glibc, Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Ρ€Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° причинят ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. И Π°ΠΊΠΎ са, Ρ‚ΠΎΠ³Π°Π²Π° вСроятно са нСприятни. Π•Ρ‚ΠΎ някои ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π²ΡŠΠ·Π½ΠΈΠΊΠ½Π°Ρ‚:
  • Alpine ΠΈΠΌΠ° ΠΏΠΎ-малък Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° стСка Π½Π° Π½ΠΈΡˆΠΊΠ°Ρ‚Π° ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π³Ρ€Π΅ΡˆΠΊΠΈ Π² Python
  • Някои ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ са ΠΎΡ‚ΠΊΡ€ΠΈΠ»ΠΈ Ρ‚ΠΎΠ²Π° Python прилоТСнията работят ΠΏΠΎ-Π±Π°Π²Π½ΠΎ ΠΏΠΎΡ€Π°Π΄ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ musl разпрСдСля ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° (Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ glibc).
  • Π•Π΄ΠΈΠ½ ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Ρ‚Π°Ρ‚Π°

Бъс сигурност Ρ‚Π΅Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ Π²Π΅Ρ‡Π΅ са ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½ΠΈ, Π½ΠΎ ΠΊΠΎΠΉ Π·Π½Π°Π΅ ΠΎΡ‰Π΅ ΠΊΠΎΠ»ΠΊΠΎ.

НС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ изобраТСния Π½Π° Alpine Π·Π° Python

Ако Π½Π΅ искатС Π΄Π° сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°Ρ‚Π΅ с Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΈ дълги ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΠΈ, Ρ‚ΡŠΡ€ΡΠ΅ΠΉΠΊΠΈ зависимости ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ, Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Alpine Linux ΠΊΠ°Ρ‚ΠΎ основно ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π˜Π·Π±ΠΎΡ€ Π½Π° Π΄ΠΎΠ±Ρ€ΠΎ Π±Π°Π·ΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€