Comment écrire un Dockerfile pour les débutants

Comment écrire un Dockerfile pour les débutants

Avant de plonger dans ce qu’est un Dockerfile, menons une petite expérience. Vous souvenez-vous de l’image Python que nous avons téléchargée dans la section précédente ? Commençons par entrer dans le conteneur à l’aide de la commande docker run -it. Rappelez-vous ce que fait le paramètre -it : il attribue un pseudo-TTY au conteneur, permettant à l’utilisateur d’interagir avec lui. Une fois dans le conteneur, listons tous les fichiers du répertoire courant :

[root@novita ~]# docker run -it python:3.7 /bin/bash
root@692f87774bf7:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@692f87774bf7:/# 

Ensuite, créons un fichier nommé hello.py et listons à nouveau tous les fichiers :

root@692f87774bf7:/# touch hello.py
root@692f87774bf7:/# ls
bin  boot  dev  etc  hello.py  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Vous pouvez voir que hello.py a été créé. Maintenant, quittons le conteneur et entrons à nouveau en mode interactif avec la même commande docker run -it python:3.7 /bin/bash, puis listons tous les fichiers :

root@692f87774bf7:/# exit
exit
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@65c767655e8a:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@65c767655e8a:/#

Vous avez probablement remarqué le problème maintenant. Curieusement, le fichier que nous avons créé plus tôt a disparu. Cela est dû au fait que les actions effectuées à l’intérieur du conteneur ne modifient pas l’image. Le conteneur ajoute simplement une couche inscriptible au-dessus de l’image, un peu comme un papier calque sur un modèle de calligraphie — quoi que vous écriviez sur le calque, cela n’affecte pas la couche en dessous. Cette fonctionnalité ressemble un peu à un instantané de machine virtuelle. Mais voici le problème : si les actions dans le conteneur ne modifient pas l’image, comment pouvons-nous parvenir à un déploiement rapide sans répéter certaines opérations avant chaque déploiement de code ? Ce serait assez inefficace. Supposons que vous soyez le responsable technique d’une plateforme de médias sociaux et qu’un événement viral se produise soudainement, nécessitant de passer rapidement à des centaines de serveurs cloud pour gérer un trafic utilisateur massif. Votre équipe a choisi Docker pour le déploiement de l’application. Si vous déployez avec la méthode ci-dessus, les utilisateurs pourraient être déçus. Au moment où votre service se rétablit, ils pourraient déjà être passés à autre chose. C’est là qu’intervient le Dockerfile. Selon l’introduction officielle de Docker : Docker peut construire automatiquement des images en lisant les instructions d’un Dockerfile. Un Dockerfile est un document texte qui contient toutes les commandes qu’un utilisateur pourrait appeler en ligne de commande pour assembler une image. En utilisant docker build, les utilisateurs peuvent créer une construction automatisée qui exécute plusieurs instructions en ligne de commande successivement. En termes plus simples, un Dockerfile est un document texte contenant toutes les commandes nécessaires pour construire une image à partir de la ligne de commande. C’est comme un manuel d’instructions pour assembler un ensemble de blocs en l’image souhaitée.

Explorons comment construire un Dockerfile à partir d’un scénario pratique, en utilisant une image Python comme exemple. Sur ma machine locale (en dehors du conteneur), il y a un script Python nommé Optimal_Hotel_Matching.py. C’est un programme de scraping web. Essayons de l’exécuter à l’intérieur du conteneur :

Comme prévu, il y a une erreur car la bibliothèque HTTP requests, qui est un module tiers, n’est pas installée dans l’image Python. C’est un scénario typique où nous devons configurer un environnement de dépendances. Essayons de résoudre cela en utilisant un Dockerfile. Avant d’écrire notre premier Dockerfile, familiarisons-nous avec quelques instructions courantes du Dockerfile :

  • FROM : Spécifie l’image de base pour la construction.
  • MAINTAINER : Décrit le créateur de l’image avec son nom et son email.
  • RUN : L’une des commandes les plus cruciales dans un Dockerfile. Elle exécute des commandes dans le conteneur et valide les résultats.
  • CMD : Spécifie la commande à exécuter au démarrage du conteneur.
  • COPY : Copie des fichiers de l’hôte vers le système de fichiers du conteneur.
  • WORKDIR : Définit le répertoire de travail pour toutes les commandes RUN, CMD ou ENTRYPOINT qui suivent dans le Dockerfile.

Maintenant, écrivons notre premier Dockerfile pour répondre à nos besoins : installer la bibliothèque requests et exécuter le script. Voici une solution possible :

FROM python:3.7                             # Spécifier l'image de base comme python:3.7
MAINTAINER ultra "tech@novita.ai"     # Nom et email du créateur de l'image
RUN pip install requests                  # Installer la bibliothèque requests
WORKDIR /dockerfileTest                   # Définir le répertoire de travail
COPY . .                                  # Copier le contenu du répertoire courant dans le conteneur
CMD ["python", "Optimal_Hotel_Matching.py"]  # Commande pour exécuter le script

Enregistrez le contenu ci-dessus dans un fichier nommé Dockerfile dans votre répertoire de projet. Maintenant, construisons l’image à l’aide de la commande docker build, en la taguant pour une identification facile :

[root@novita dockerfileTest]# docker build --tag python:requests .
Sending build context to Docker daemon  5.12 kB
...

Une fois la construction terminée, utilisez la commande docker images pour vérifier :

[root@novita dockerfileTest]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
python                  requests            04f20acdc288        2 hours ago         926 MB
...

Vous pouvez voir qu’une nouvelle image Python taguée requests a été générée localement. Essayez d’exécuter cette image pour voir si l’erreur No module named 'requests' persiste, et si le programme s’exécute comme prévu.

[root@novita dockerfileTest]# docker run python:requests
Computing distance between 116.368816,39.866464  and  116.438946,39.921624
Computing distance between 116.370910,39.869603  and  116.438946,39.921624
...

Succès ! Le conteneur a exécuté le code et s’est arrêté. Est-ce la fin ? Dans cet article, j’ai partagé une application simple des Dockerfiles. Dans les environnements de production réels en entreprise, les Dockerfiles ont tendance à être plus complexes.

Novita AI est la plateforme cloud tout-en-un qui alimente vos ambitions en IA. Avec des API parfaitement intégrées, le calcul serverless et l’accélération GPU, nous fournissons les outils rentables dont vous avez besoin pour construire et développer rapidement votre entreprise basée sur l’IA. Éliminez les problèmes d’infrastructure et commencez gratuitement – Novita AI fait de vos rêves d’IA une réalité.

*Lectures recommandées :

  1. Guide ultime pour développer un outil de suréchantillonnage ESRGAN 4x
  2. Maîtriser Stable Diffusion LoRA : Stratégies pour le succès