L'objectif de ce repo est l'apprentissage de docker afin de pouvoir déployer le projet MUSIC PLAYGROUND
- Image docker hello world :
- Installation de
flask
- Print d'un message bidon
- Installation de
- image docker Grab Discography :
- Installation de tout les packages python du projet music_playground
- Récupération de la discographie d'un artiste via l'API Spotify
- Passage d'arguments dans le
docker run
- image docker Grab Discographies
- Installation de tout les packages python du projet music_playground
- Récupération DES discographies d'une liste d'artistes représentés par un fichier input
artists.txt
- Le fichier
artists.txt
est montée au moment dudocker run
- image docker Final Application
- Installation de tout les packages python et linux du projet music_playground
- Application finale dockerisée du projet music_playground
- Récupération des discographies
- Récupération des urls des tracks sur Youtube
- Téléchargements des tracks au format mp3
- Récupération des commentaires YouTube des tracks (NE FONCTIONNE PAS)
- Récupération de meta data subsidiaires (nombre de vues, likes, dislikes, etc.) (PAS ENCORE)
- Copie intégrale des fichiers crées dans le container en local
Docker est utile pour déployer une application de type service. Un service répond à une question précise. Typiquement, dans le machine learning supervisé, les services possibles sont :
- Reconnaissance d'images
- Examiner si une transaction est frauduleuse ou pas
- Extraire les features audio d'un artiste
- etc.
Dans notre cas, i.e. télécharger des millions de fichiers, notre application est de type task. On veut executer une tâche. Cependant, docker pourrait nous servir car il permet d'isoler une application et donc de la démultiplier à l'infini sur plusieurs serveurs mais c'est une espèce d'utilisation détourné de docker
-
FROM alias-image
permet de télécharger une image situé sur le docker hub. C'est la première commande car il faut d'abord importer python afin de lancer l'installation des packages viapip
. Le mot clé alias-image représente l'alias d'une image hébergé sur le docker hub. Pour les applications python dockerisés, si le souci de place n'est pas une priorité, il vaut mieux choisir unebuster
image. Il s'agit du mot clé utilisé pour parler d'une version python complète.FROM python:3.7-buster
est une bonne valeur par défaut -
WORK foldername
permet de désigner le folder par défaut dans le docker. C'est pour ça qu'il est signifié assez haut dans le dockerfile. Par exemple, la suite de commandesWORKDIR /app
+COPY fun.py .
signifie le dossier par défaut dans le docker est /app + tu copies le fichier fun.py dans le dossier /app -
COPY files
permet de monter les fichiers en host vers le docker. Typiquement, on monte tout les scripts python et les inputs file via cette commande -
RUN commande
permet de run des commandes lors de la construction de l'image. Typiquement, pour installer les packages on utilise cette commande -
CMD ou ENTRYPOINTS
permet lancer une commande, une fois l'image construite. Typiquement, on lance l'application python via cette commande. On préfère utiliser la commande CMD plutot que ENTRYPOINTS, bon apparemment c'est une question de subtilité que je ne comprends pas pour le moment
Il y a globalement deux facons de faire:
- Monter un fichier dans le container au moment du run. Par exemple, l'image contient une commande qui prend un fichier en input tel que
python app.py inputfile.txt
. On peut donc monter le fichier inputfile.txt au moment du run de cette façondocker run -v inputfile.txt:/app/inputfile.txt docker-image
- On peut également passer des arguments de manière plus habituelle comme une application python classique (exemple). Pour ce faire :
- Dans
Dockerfile
, renseignez les variables globales à l'aide du mot cléENV
. Par exempleENV INPUTFILE=jamesruskin.json
- La commande
CMD
ne peut alors plus être défini comme une liste de string comme l'explique le post stackoverflow. On pourrait avoir par exempleCMD python app.py $INPUTFILE
- Lors du docker run, signaler simplement la valeur de la variable
INPUTFILE
grâce au flag-f
de cette manière :docker run -e INPUTFILE=jeffmills.json docker-image
- Récupérer l'id ou bien le name du container en question en faisant : sudo docker ps -all
- Rappatrier le fichier en question dans le folder data :
sudo docker cp <NAME or ID>:<CONTAINER_PATH> <HOST_PATH>
- Exemple avec id :
sudo docker cp 04546594ef54:/app/output.json data/output.json
- Exemple en utilisant le name du container :
sudo docker cp gallant_mclaren:/app/output.json data/output.json
- On build une image, qui contient une application/service
- On run une image, ce qui produit un container
- A chaque fois qu'on run une image, ca crée un container de plus. Attention la mémoire peut vite saturée. Raison pour laquelle, une bonne pratique à utiliser lorsqu'on run un docker en test ou bien pour une tâche bien précise on fait
docker run monimage --rm
docker build -t monimage .
: permet de build une image dockerdocker run monimage
: permet de run une imagedocker images
: permet de lister toutes les images docker présentes en localdocker -ps all
: permet de lister tout les containersdocker rmi -f imageid
: permet de remove une image docker
# -*- coding: utf-8 -*-
: entête à placer dans les scripts python pour prendre en compte la gestion des accents.#!/usr/bin/python3
: Attention cette commande n'est pas obligatoire, elle sert juste à rendre le script python appelable sans passer par la commandepython
si le script a été rendu executable par la commandechmod +x myscript.py