Compilazione Docker per Python

Un'altra storia marginale per una build Docker per un'applicazione Python. Stavo lavorando con uno script Python che aveva la dipendenza di un modulo che richiede più altri moduli, ad esempio cryptography. Questo non è molto raro e la maggior parte dei progetti complessi avrebbe una grande catena di dipendenze.

Il problema è iniziato quando ho provato a impacchettare l'applicazione Python in un'immagine Docker. Per esempio. cryptographymodule come da documento ufficiale , richiederà diversi pacchetti per compilare il pacchetto. La soluzione è semplice, costruiamo un'immagine:

FROM python:alpine
RUN apk upgrade --no-cache
RUN apk add --no-cache gcc musl-dev python3-dev libffi-dev openssl-dev cargo
WORKDIR /source
COPY app.py /source/
COPY requirements.txt /source/
RUN python3 -m venv /source/venv
RUN . /source/venv/bin/activate && pip install --upgrade pip pip install -r /source/requirements.txt
ENTRYPOINT [ "python3", "app.py" ]

Questo è un problema noto e la soluzione è utilizzare un modello di build multistadio , che è abbastanza comune per C, Java, Golan, ecc., Non tanto per Python (o non è stato possibile trovare molti riferimenti) ma lo stesso può essere usato anche per Python. Nella maggior parte dei casi d'uso non avrebbe senso utilizzare build multifase, ma può essere utile nei casi in cui utilizziamo moduli con estensioni C/C++ all'interno del pacchetto.

Virtualenv per build multistadio

Per una build multistadio con Python, possiamo facilmente utilizzare ambienti virtuali Python ( virtualenv). Dando un'occhiata al virtualenv del cryptographymodulo, ad esempio, ho notato che anche le librerie binarie vengono catturate all'interno del virtualenv.

(venv) ubuntu@maas:~/venv/lib/python3.8/site-packages$ find . -name "*.so"
./cryptography/hazmat/bindings/_openssl.abi3.so
./cryptography/hazmat/bindings/_padding.abi3.so
./cryptography/hazmat/bindings/_rust.abi3.so
./_cffi_backend.cpython-38-x86_64-linux-gnu.so

FROM python:alpine as build
RUN apk upgrade --no-cache
RUN apk add --no-cache gcc musl-dev python3-dev libffi-dev openssl-dev cargo
WORKDIR /source
RUN python3 -m venv /source/venv
RUN . /source/venv/bin/activate && \
python3 -m ensurepip --upgrade && \
python3 -m pip install -r /source/requirements.txt
# Build the final image
FROM python:alpine as final
RUN apk upgrade --no-cache
WORKDIR /source
COPY --from=build /source /source
CMD . /source/venv/bin/activate && python3 app.py

→ docker image ls
REPOSITORY                           TAG        IMAGE ID       CREATED          SIZE
python-app-multistage                latest     e86e17a1fc38   37 seconds ago   66MB
python-app                           latest     fc207639930c   20 hours ago     1.29GB

Anche se funziona bene, c'è un modo migliore? Mentre stavo cercando di risolvere questo problema, mi sono imbattuto in PEX tramite Twitter. La migliore introduzione è stata “ WTF is PEX? ” di Twitter University. E se impacchettassi gli stessi moduli in PEX e impacchettassi PEX con l'immagine:

FROM python:alpine as build
RUN apk upgrade --no-cache
RUN apk add --no-cache gcc musl-dev python3-dev libffi-dev openssl-dev cargo
WORKDIR /source
RUN python3 -m ensurepip --upgrade && python3 -m pip install pex~=2.1.47
RUN pex simple_salesforce -o /source/pex_wrapper
RUN chown -R python:python /source
# Build the final image
FROM python:alpine as final
RUN apk upgrade --no-cache
WORKDIR /source
COPY --from=build /source /source
ENTRYPOINT [ "/source/pex_wrapper", "app.py" ]

→ docker image ls
REPOSITORY                           TAG        IMAGE ID       CREATED          SIZE
python-app-multistage-pex            latest     0fff7004bb49   7 seconds ago    47.2MB
python-app-multistage                latest     e86e17a1fc38   32 minutes ago   66MB
python-app                           latest     fc207639930c   21 hours ago     1.29GB

Riepilogo

C'erano poche altre opzioni come quella dh-virtualenvbasata debsull'imballaggio, che potrebbe essere un'opzione e potrei testarla se trovo un po' di tempo libero.

Questo ha funzionato bene nel mio caso d'uso, tuttavia mi piace ascoltare storie in cui hai provato e fallito. Se hai provato questo approccio e hai riscontrato problemi, mi piacerebbe conoscere gli esempi o le alternative che hai provato e che hanno funzionato. Lascia un commento qui sotto.

Suggested posts

Come eseguire i plug-in ChatGPT gratuitamente utilizzando Langchain

Come eseguire i plug-in ChatGPT gratuitamente utilizzando Langchain

Devi aver sentito parlare di tutti i nuovi potenti plug-in ChatGPT come Browser, Code Interpreter ecc. Ma c'è un problema, l'accesso ai plug-in è limitato a una lista di attesa e quindi molti non hanno accesso ad essa.

Le mie risorse di codifica più utilizzate

Le mie risorse di codifica più utilizzate

Questa settimana ho ricevuto un'e-mail da un membro della mailing list quotidiana. Volevano sapere: quali risorse visiti giornalmente, settimanalmente e mensilmente? Ottima domanda! Sono felice di provare a condividere alcune informazioni sul mio flusso di lavoro e sulle migliori risorse che utilizzo.

Related posts

L'esibizione da solista della ragazza dai capelli rossi

Su incarico di Hayden, Katie si filma mentre si masturba.

L'esibizione da solista della ragazza dai capelli rossi

Era mezzanotte passata quando Hayden riportò Katie al dormitorio del college dopo la loro serata insieme. Aveva una lezione la mattina presto e non aveva un altro cambio di vestiti dopo essere stata con lui la sera prima.

Il primo libro per sballarsi di un bambino

Il primo libro per sballarsi di un bambino

(Attenzione: questa è satira, destinata ad essere allegramente sovversiva, sicuramente non per bambini) Hai visto tua madre e tuo padre nascondersi in cucina e fumare quelle sigarette puzzolenti. Ti dicono.

La lenta erosione: svelare i modi in cui le persone deperiscono nella loro carriera

La lenta erosione: svelare i modi in cui le persone deperiscono nella loro carriera

Nel mondo frenetico e competitivo di oggi, la propria carriera gioca un ruolo significativo nella crescita personale, nella stabilità finanziaria e nella soddisfazione generale della vita. Tuttavia, molte persone si trovano intrappolate in un ciclo inesorabile di stagnazione e insoddisfazione, che si esauriscono gradualmente nella loro vita professionale.

L'arte è sempre apolitica?

L'arte è sempre apolitica?

Ieri abbiamo chiuso le porte dell'Eurovision Song Contest di quest'anno con un gran finale scintillante e caotico in cui la cantante svedese Loreen ha portato a casa il trofeo, diventando la prima donna a vincere due volte e riportando la corona alla Svezia 50 anni dopo che gli ABBA hanno vinto la competizione con "Waterloo". Hanno continuato a diventare uno dei più grandi artisti nel canone della musica pop.