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.
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
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.
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.
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.
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.
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é.
[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.
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.