GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment dockeriser les applications Python avec Miniconda [une approche hybride]

Si vous connaissez Docker, vous savez probablement que vous pouvez créer une image Docker personnalisée à l'aide de Dockerfile. J'ai écrit sur les détails.

Comment créer une image Docker personnalisée avec Dockerfile [très facile] La véritable puissance de Docker réside dans l'ajustement de l'image Docker de base à vos besoins. Avec cela, vous pouvez facilement et rapidement déployer un environnement Linux personnalisé en exécutant un conteneur à partir de cette image Docker personnalisée. Manuel LinuxAvimanyu Bandyopadhyay

Dans ce tutoriel, je vais vous montrer comment suivre la même idée mais pour les seules applications Python. Cela va être utile pour les utilisateurs et les développeurs.

Je vais utiliser une image Python minimale. Une fois que vous avez modifié et révisé cette image, vous n'aurez plus à vous soucier de l'installation de votre application Python sur différents systèmes d'exploitation. Vous pourrez immédiatement exécuter votre application Python avec Docker à chaque fois. Ainsi, vous pouvez dire adieu à ces problèmes d'installation basés sur l'hôte !

Créer une image docker pour votre application Python

Je vais utiliser Miniconda ici. Miniconda est un programme d'installation minimal gratuit pour conda et vous offre une petite version de démarrage d'Anaconda avec juste les éléments essentiels dont vous avez besoin pour exécuter des applications Python.

Pourquoi Miniconda ?

Il y a plus d'une raison :

Lorsque vous installez Miniconda sur un hôte, vous n'utilisez pas réellement la version Python fournie par le gestionnaire de packages du système d'exploitation. Miniconda s'installe sur un emplacement séparé ayant son propre environnement Python. Ainsi, cela vous offre un niveau d'isolation supplémentaire lorsque vous le faites sur un conteneur Docker.

En raison du point ci-dessus, vous bénéficiez également d'un autre avantage :puisque vous utilisez conda que Miniconda a installé, vous pouvez utiliser cet outil pour modifier la version Python appropriée de votre application selon vos besoins. C'est une aide précieuse pour les développeurs d'applications basées sur différentes versions de Python 3 : 3.6, 3.7, 3.8, 3.9 ou des versions antérieures.

Par exemple, si par défaut vous exécutez Python 3.9 mais que votre application Python nécessite Python 3.7 en raison de dépendances pertinentes, que feriez-vous ?

C'est là que conda peut vous aider. Avec lui, vous pouvez exécuter conda install python=3.7 pour changer la version de Python requise en l'installant avec toutes les dépendances nécessaires.

  • Miniconda vous permet d'installer des applications Python 2 et Python 3. Bien que Python 2 soit officiellement mort, vous pouvez toujours tester des applications plus anciennes sur cet environnement sans avoir besoin d'auditer votre nouveau port Python 3 avec 2to3.
  • Il existe également de nombreux cas d'utilisation où une application Python s'exécutant sur Miniconda recherche des dépendances côté hôte non-Python (par exemple g++ ). C'est alors que la puissance combinée de Miniconda et de Docker devient une excellente solution !
  • Ai-je oublié de mentionner que vous pouvez également créer et activer vos propres environnements d'application Python avec conda ? Isolement à nouveau !
  • À tout moment, vous avez toujours la possibilité de basculer entre la version Python par défaut du conteneur Docker et celle de Miniconda. Cela vous donne plus de flexibilité car vous pouvez toujours reconstruire une nouvelle image avec la modification quand vous le souhaitez.

Alors, continuons maintenant avec la création de la nouvelle image d'application Python avec Miniconda et Docker !

Prérequis

Si vous ne l'avez pas déjà fait, veuillez installer Docker sur Ubuntu ou sur la distribution Linux que vous utilisez. Assurez-vous de vous ajouter au groupe docker afin de pouvoir exécuter docker sans sudo. Vous aurez besoin d'une connexion Internet active pour télécharger l'image Docker de base.

Pour un exemple d'application Python, j'utilise un simple "Hello World!" exemple nommé python-app.py pour vous permettre de comprendre plus facilement comment l'exécuter via Miniconda sur Docker.

Une application Python à part entière qui utilise différentes bibliothèques Python bénéficierait grandement de la même procédure, notamment en raison des diverses dispositions de dépendance de Miniconda.

Étape 1 :Obtenir l'image Docker [facultatif]

J'ai choisi Python Slim dans cet exemple au lieu d'Alpine Linux. Ce dernier est vraiment petit mais peut grandement affecter les performances lorsqu'il s'agit d'exécuter des applications. Cependant, Python Slim fait environ 40 Mo, basé sur Debian Buster et Python 3.9.1.

Cette étape est facultative. Je l'ai inclus pour montrer que vous pouvez le comparer avec l'image de l'application python personnalisée comme dans le précédent tutoriel Dockerfile.

Extrayez la dernière image docker de Python Slim en utilisant le docker pull commande :

docker pull python:slim

Étape 2 :Créer Dockerfile avec la personnalisation nécessaire

Créons maintenant un nouveau fichier vide nommé Dockerfile à l'aide de la commande touch. Mais créez d'abord un répertoire pour votre application docker.

mkdir python-docker
cd python-docker
touch Dockerfile

Je joindrai le Dockerfile complet ci-dessous après avoir fini d'expliquer les étapes du processus de création d'image via une présentation étape par étape du fichier.

Voici comment commencer et progresser dans la création de l'image :

Préparer l'image de base

Mettez à jour les derniers packages par défaut en utilisant Python Slim comme image de base.

FROM python:slim
RUN apt-get update && apt-get -y upgrade \

Installer les dépendances de packages non-Python

Installez toutes les dépendances non-Python pour votre application Python (disons g++ et tout autre selon vos besoins).

  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    gcc \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

Git et Wget peuvent être très pratiques lors de la récupération d'applications Python à partir de différents référentiels et URL. Enfin, nettoyez de l'espace avec rm -rf /var/lib/apt/lists/* pour minimiser la taille finale de l'image Docker.

Installer Miniconda

Une fois installé, Miniconda met à jour .bashrc pour passer à sa propre version Python.

ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-latest-Linux-x86_64.sh -b \
    && rm -f Miniconda3-latest-Linux-x86_64.sh \

Ici, une variable d'environnement est définie dans le chemin du système de conteneur. ENV est destiné aux conteneurs que vous exécuterez sur l'image et ARG est destiné aux conteneurs intermédiaires qui sont créés lors de sa première construction.

Ainsi, la différence entre le ENV et ARG instructions dans le bloc de code ci-dessus est que ce dernier n'est disponible que pendant la construction de l'image. Découvrez cette belle explication ici.

Avec wget , téléchargez la dernière version de Miniconda à partir du référentiel officiel Anaconda. Après avoir créé le répertoire de configuration essentiel, installez-le et enfin supprimez le programme d'installation.

Configurer Miniconda sur le Bash Shell

Après avoir installé Miniconda, affichez son numéro de version pour confirmation et initialisez-le sur le shell Bash pour le conteneur . La deuxième ligne met à jour votre .bashrc par défaut fichier :

	&& echo "Running $(conda --version)" && \
    conda init bash && \

Recharger Bash avec les nouvelles modifications

Rechargez Bash pour que le système de construction Docker passe à la version Miniconda Python plutôt qu'à celle de Debian (l'image de base du système d'exploitation).

	. /root/.bashrc && \

Mettez également à jour les packages Miniconda actuels fournis par défaut.

	conda update conda && \

Préparer un environnement Conda pour votre application

Créez et activez un environnement Conda distinct pour votre application Python.

    conda create -n python-app && \
    conda activate python-app && \

Installez la version Python appropriée dont vous avez besoin pour votre application. En supposant que votre application est basée sur Python 3.6, définissez cette version dans le nouvel environnement virtuel avec Pip, qui est également très pratique lors de la gestion des applications Python.

    conda install python=3.6 pip && \

Installez votre application Python

Selon la façon dont vous utilisez votre application, vous pouvez :

je. Installez-le avec pip qui utilise classiquement le setup.py fichier disponible dans votre référentiel. C'est le même outil dont nous avons parlé plus tôt, mais ici, je l'utilise via Conda à la place.

	git clone replace-me-with-repo-url
	cd repo-name
	pip install -e .

ii. ..ou l'exécuter directement avec le python commande :

	git clone replace-me-with-repo-url
	cd repo-name
	python python-app.py

Dans la démo Dockerfile, je vais utiliser le "Hello World!" exemple pour vous permettre de comprendre plus facilement comment vous pouvez l'exécuter directement en lançant un conteneur ou à l'intérieur de son shell bash avec Docker. Donc, disons que j'utilise la 2ème méthode :

    echo 'print("Hello World!")' > python-app.py

Alors maintenant que j'ai inclus la ligne ci-dessus, un fichier appelé python-app.py est créé qui est censé générer le message Hello World chaque fois que vous l'exécutez avec la commande python python-app.py .

Mettez à jour le fichier .bashrc pour votre application comme le fait Miniconda :

Le programme d'installation de Miniconda met automatiquement à jour le fichier .bashrc après avoir exécuté conda init bash comme indiqué précédemment. Vous pouvez également faire de même pour votre application Python. Chaque fois que vous exécutez le conteneur bash, l'environnement est activé et vous pouvez également utiliser le nom de votre application Python comme commande pour l'exécuter. Ici, j'ai utilisé le nom comme python-app :

RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc

Préparer l'application pour l'exécution finale

Enfin, je crée un point d'entrée et j'attribue la commande qui vous permettra de l'exécuter à chaque fois que vous exécuterez un conteneur basé sur cette image :

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

Fichier Docker complet

Vous pouvez utiliser un éditeur comme Vim ou Nano ou utiliser le cat commande pour ajouter les lignes décrites ci-dessus au Dockerfile.

FROM python:slim
RUN apt-get update && apt-get -y upgrade \
  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-latest-Linux-x86_64.sh -b \
    && rm -f Miniconda3-latest-Linux-x86_64.sh \
    && echo "Running $(conda --version)" && \
    conda init bash && \
    . /root/.bashrc && \
    conda update conda && \
    conda create -n python-app && \
    conda activate python-app && \
    conda install python=3.6 pip && \
    echo 'print("Hello World!")' > python-app.py
RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

Lorsque vous essayez votre propre application, remplacez le echo 'print("Hello World!")' > python-app.py ligne ci-dessus avec l'une des deux méthodes décrites dans la section Installez votre application Python ci-dessus.

Étape 3 :Créez l'image de l'application Python avec le Dockerfile

Comme vous le savez peut-être déjà, la commande pour créer l'image Docker modifiée à partir du Dockerfile ressemble à :

docker build -t python-app PATH_to_Dockerfile

Avec la balise -t, vous spécifiez le nom de l'image Docker de votre application. Je l'ai défini comme python-app dans l'exemple de commande ci-dessus.

Considérant que le Dockerfile se trouve dans votre répertoire actuel, vous pouvez créer la nouvelle image Docker de votre application Python comme ceci :

docker build -t python-app .
[email protected]:~/python-docker$ docker build -t python-app .
Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM python:slim
 ---> 677f7ac99e48
Step 2/8 : RUN apt-get update && apt-get -y upgrade   && apt-get install -y --no-install-recommends     git     wget     g++     ca-certificates     && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 15ee9c47c83b
Step 3/8 : ENV PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> cfd5ed6b5ec9
Step 4/8 : ARG PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> e70d06b5ff10
Step 5/8 : RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh     && mkdir /root/.conda     && bash Miniconda3-latest-Linux-x86_64.sh -b     && rm -f Miniconda3-latest-Linux-x86_64.sh     && echo "Running $(conda --version)" &&     conda init bash &&     . /root/.bashrc &&     conda update conda &&     conda create -n python-app &&     conda activate python-app &&     conda install python=3.6 pip &&     echo 'print("Hello World!")' > python-app.py
 ---> Using cache
 ---> 8a7957a6abb2
Step 6/8 : RUN echo 'conda activate python-app \nalias python-app="python python-app.py"' >> /root/.bashrc
 ---> Running in e3193e93b631
Removing intermediate container e3193e93b631
 ---> 948f45eb6024
Step 7/8 : ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
 ---> Running in 621624951dcf
Removing intermediate container 621624951dcf
 ---> 6e8824889502
Step 8/8 : CMD ["python python-app.py"]
 ---> Running in dc97f9d0d8fe
Removing intermediate container dc97f9d0d8fe
 ---> 01bae0a9903c
Successfully built 01bae0a9903c
Successfully tagged python-app:latest

La sortie ci-dessus est basée sur des données mises en cache, mais lorsque vous l'exécutez pour la première fois, cela prendrait un certain temps et produirait une sortie de journal beaucoup plus longue.

Vérifions maintenant que l'exemple d'application est installé sur votre image Docker modifiée en exécutant un conteneur à partir de celle-ci :

docker run python-app
[email protected]:~/python-docker$ docker run python-app
Hello World!

Ainsi, grâce à Docker et Miniconda, vous pouvez désormais exécuter le programme directement sans aucune installation préalable ! À partir de maintenant, tout ce dont vous avez besoin est l'image.

Connectons-nous maintenant au shell bash à l'intérieur de ce conteneur :

docker run -ti python-app bash
[email protected]:~/python-docker$ docker run -ti python-app bash
(python-app) [email protected]:/# 

Comme vous pouvez le voir, vous êtes maintenant dans l'environnement activé par Conda que vous avez créé précédemment via le Dockerfile. Le -ti flag est utilisé pour créer une borne interactive pour vous. Vous pouvez maintenant utiliser la commande que vous avez aliasée pour exécuter l'application :

(python-app) [email protected]:/# python-app
Hello World!

Confirmons également que vous utilisez bien la version Python de Miniconda et non la version Python par défaut :

(python-app) [email protected]:/# python --version
Python 3.6.12 :: Anaconda, Inc.

Comme je l'avais mentionné plus tôt, Miniconda est une version miniaturisée d'Anaconda.

Une fois que vous avez tout défini, vous pouvez transférer votre image finale vers Docker Hub si vous hébergez une application Python Open Source sur GitHub, GitLab, Gitea, Bitbucket ou tout autre référentiel.

Quittez le conteneur en tapant exit dans le terminal. Arrêtez le conteneur, supprimez le conteneur et supprimez les images Docker (si vous le souhaitez) pour libérer de l'espace disque.

Bravo! Vous venez d'apprendre à créer votre propre image Docker pour votre application Python.

Cela vous a-t-il été utile ?

Vous voyez donc que Miniconda vous aide non seulement à rendre votre application plus flexible et à l'épreuve du temps au niveau de l'utilisateur, mais il facilite également le rôle du développeur.

Pensez à quel point il serait pratique de configurer cela avec PyCharm ! Vous installez Miniconda et votre application Python comme vous le feriez sur un système hôte, mais comme vous le construisez et l'enregistrez en tant qu'image Docker, cela devient un processus unique !

Si vous le souhaitez, vous pouvez expérimenter les différents exemples présentés dans ce didacticiel précédent au lieu de "Hello World!" exemple que j'ai utilisé dans celui-ci.

J'espère que cela t'aides! Si vous avez des questions ou des suggestions, veuillez laisser un commentaire ci-dessous.


Docker
  1. Comment installer et héberger un serveur OpenVPN avec Docker

  2. Comment installer Jenkins avec Docker

  3. Comment déployer des microservices avec Docker

  4. Comment déployer des applications avec Rancher

  5. Comment déployer un conteneur nginx avec Docker sur Linode

Comment remplacer Docker par Podman sur un Mac

Comment déployer des piles Docker Compose sur Kubernetes avec Kompose

Comment sécuriser le socket TCP de Docker avec TLS

Comment déployer une application API Python Flask sur Docker

Comment copier des fichiers avec Docker cp dans votre conteneur Docker

Comment créer une image Docker personnalisée avec Dockerfile