O Alpine Linux é frequentemente recomendado como a imagem base do Docker. Você foi informado de que o uso do Alpine tornará suas construções menores e o processo de construção mais rápido.Mas se você usa aplicativos Alpine Linux para Python, então:- Torna suas construções muito mais lentas
- Aumenta sua aparência
- Desperdiçando seu tempo
- E, no final, pode causar erros de tempo de execução
Vamos dar uma olhada no motivo pelo qual a Alpine o recomenda, mas por que você não deve usá-lo em um local com Python.Por que as pessoas recomendam o Alpine?
Vamos supor que precisamos do gcc como parte da nossa imagem e queremos comparar o Alpine Linux x Ubuntu 18.04 em termos de velocidade de construção e tamanho final da imagem.Para começar, baixe duas imagens e compare seu tamanho:$ 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
Como você pode ver, a imagem base do Alpine é muito menor. Vamos agora tentar instalar o gcc e começar com o 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/*
Escrevendo o Dockerfile perfeito fora deste artigo
Vamos medir a velocidade de construção:$ 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
Repita o mesmo para Alpine (Dockerfile):FROM alpine
RUN apk add --update gcc
Montamos, analisamos a hora e o tamanho da montagem:$ 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
Como prometido, as imagens baseadas na Alpine são montadas mais rapidamente e menos sozinhas: 15 segundos em vez de 30 e tamanho da imagem 105MB versus 150MB. Isso é muito bom!Mas se mudarmos para a construção de um aplicativo Python, tudo não será tão otimista.Imagem Python
Aplicativos Python geralmente usam pandas e matplotlib. Portanto, uma das opções é obter uma imagem oficial baseada no Debian usando este Dockerfile:FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas
Nós coletamos:$ 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
Temos uma imagem de 363MB de tamanho.Melhoraremos com o Alpine? Vamos tentar: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('"'"'\r\n'"'"', '"'"'\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
O que está acontecendo?Alpine não suporta rodas
Se você observar a compilação, que é baseada no Debian, verá que ele baixa o matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64. whl .Este é o binário para roda. O Alpine baixa as fontes do `matplotlib-3.1.2.tar. gz `, pois não suporta rodas padrão .Por quê? A maioria das distribuições Linux usa a versão GNU (glibc) da biblioteca padrão C, que de fato é exigida por todos os programas C, incluindo o Python. Mas Alpine usa `musl`, e como esses binários são para` glibc`, eles simplesmente não são uma opção.Portanto, se você usa o Alpine, precisa compilar todo o código escrito em C em cada pacote Python.Ah, sim, uma lista de todas essas dependências que precisam ser compiladas precisará ser pesquisada por nós mesmos.Nesse caso, obtemos o seguinte: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
E o tempo de construção leva ...... 25 minutos e 57 segundos! E o tamanho da imagem é 851MB.As imagens baseadas nos Alpes demoram muito mais, elas mesmas são maiores e você ainda precisa procurar todas as dependências. Obviamente, você pode reduzir o tamanho da compilação usando compilações de vários estágios, mas isso significa que mais trabalho precisa ser feito.Isso não é tudo!Alpine pode causar erros inesperados de tempo de execução
- Em teoria, musl é compatível com glibc, mas, na prática, as diferenças podem causar muitos problemas. E se são, certamente desagradáveis. Aqui estão alguns problemas que podem surgir:
- O Alpine tem uma pilha de fluxo menor por padrão, o que pode levar a erros no Python
- Alguns usuários descobriram que os aplicativos Python são mais lentos devido à maneira como o musl aloca memória (diferente da glibc).
- Um usuário encontrou um erro ao formatar a data
Certamente esses erros já foram corrigidos, mas quem sabe quantos mais.Não use imagens Alpine para Python
Se você não deseja se preocupar com construções grandes e longas, pesquisas de dependência e possíveis erros - não use o Alpine Linux como imagem de base. Escolhendo uma boa imagem de base .