Construction de Docker pour Python

Une autre histoire de bord pour une construction Docker pour une application Python. Je travaillais avec un script Python qui avait une dépendance d'un module qui nécessite plusieurs autres modules, par exemple cryptography. Ce n'est pas très rare, et la plupart des projets complexes auraient une grande chaîne de dépendances.

Le problème a commencé lorsque j'ai essayé de packager l'application Python dans une image Docker. Par exemple. cryptographymodule selon la doc officielle , nécessitera plusieurs packages pour construire le package. La solution est simple, construisons une image :

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" ]

Il s'agit d'un problème connu et la solution consiste à utiliser un modèle de construction en plusieurs étapes , ce qui est assez courant pour C, Java, Golan, etc. être également utilisé pour Python. Dans la plupart des cas d'utilisation, il n'aurait pas de sens d'utiliser des builds en plusieurs étapes, mais cela peut être utile dans les cas où nous utilisons des modules avec des extensions C/C++ dans le package.

Virtualenv pour les builds en plusieurs étapes

Pour une construction en plusieurs étapes avec Python, nous pouvons facilement utiliser des environnements virtuels Python ( virtualenv). En regardant le cryptographymodule virtualenv par exemple, j'ai remarqué que même les bibliothèques binaires sont capturées dans le 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

Bien que cela fonctionne bien, existe-t-il un meilleur moyen? Pendant que je cherchais à résoudre ce problème, je suis tombé sur PEX par twitter. La meilleure introduction était « WTF est PEX ? " par l'Université Twitter. Et si j'emballe les mêmes modules dans PEX et emballe PEX avec l'image :

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

Sommaire

Il y avait peu d'autres options telles que dh-virtualenvcelle basée sur l' debemballage, qui pourrait être une option, et qui pourrait le tester si je trouve du temps libre.

Cela a bien fonctionné dans mon cas d'utilisation, mais j'aime entendre des histoires où vous avez essayé et échoué. Si vous avez essayé cette approche et que vous rencontrez des problèmes, j'aimerais connaître les exemples ou les alternatives que vous avez essayées et qui ont également fonctionné. Laissez un commentaire ci-dessous.

Suggested posts

Comment exécuter gratuitement les plugins ChatGPT avec Langchain

Comment exécuter gratuitement les plugins ChatGPT avec Langchain

Vous devez avoir entendu parler de tous les nouveaux plugins ChatGPT puissants comme le navigateur, l'interpréteur de code, etc. Mais il y a un problème, l'accès aux plugins est limité à une liste d'attente et donc beaucoup n'y ont pas accès.

Mes ressources de codage les plus utilisées

Mes ressources de codage les plus utilisées

Cette semaine, j'ai reçu un e-mail d'un membre de la liste de diffusion quotidienne. Ils voulaient savoir : Quelles ressources consultez-vous quotidiennement, hebdomadairement et mensuellement ? Grande question ! Je suis heureux d'essayer de partager quelques idées sur mon flux de travail et les principales ressources que j'utilise.

Related posts

Learning at Work Week compte plus que vous ne le pensez

Learning at Work Week compte plus que vous ne le pensez

Nous avons souvent du mal à mettre en œuvre ce que nous savons être bon pour nous. Qu'il s'agisse de dire à un proche que nous l'aimons ou de se rappeler de parler comme un pirate, il y aura toujours ceux qui prétendent qu'un jour, une semaine ou un mois d'événements ne sont pas nécessaires parce qu'ils font déjà ces choses.

3 façons éprouvées d'améliorer vos compétences en écriture

Les avantages de l'écriture et les stratégies pour vous aider à le faire

3 façons éprouvées d'améliorer vos compétences en écriture

En 2022, avec la sortie de GPT-3, la compétence en écriture semble devenir moins importante. Avec l'IA, les personnes ayant une mauvaise écriture peuvent également générer du personnel de qualité.

Le meurtre de Jordan Neely et le problème du racisme « patriotique »

Les États-Unis peuvent-ils prendre la mesure essentielle de ne pas assimiler un comportement raciste au fait d'être un bon Américain ?

Le meurtre de Jordan Neely et le problème du racisme « patriotique »

[Alerte de déclenchement : cet essai comprend des captures d'écran de personnes faisant l'éloge du meurtrier de Jordan Neely.] Les responsables de l'application des lois ont finalement - et peut-être à contrecœur - inculpé Daniel Penny, l'homme qui a étouffé Jordan Neely jusqu'à sa mort, pour cet homicide.

Comment sauver la planète et gagner de l'argent

Comment sauver la planète et gagner de l'argent

Combien de fois avez-vous jeté une bouteille en plastique, un bocal en verre, une canette en aluminium ou un paquet d'énergie verte sans réfléchir à deux fois ? Combien de fois avez-vous souhaité pouvoir obtenir quelque chose en échange de leur recyclage ? Si vous êtes comme la plupart des gens, la réponse est probablement plusieurs fois. Le recyclage est souvent perçu comme un tracas, une corvée ou un devoir qui n'apporte aucun bénéfice immédiat ou tangible.