Ecrire un job .NET Core et l’héberger avec Docker

Je travaille sur les technologies de développement Microsoft depuis plus de 12ans et certaines nouveautés au fur et à mesure des versions de Microsoft .NET ont retenu mon attention, mais si je ne devais en garder qu’une, celle qui m’a le plus passionnée, c’est incontestablement .NET Core.

Pour faire (très) simple, .NET Core permet d’utiliser l’expérience du .NET Framework dans la réalisation de job applicatif et de site web…. pour Linux et Mac !!!!!!

L’intérêt est monstrueux lorsque l’on connait les performances sur Linux et qu’un job .NET Core peut désormais être hébergé sur une machine Linux et/ou dans un container Docker sans avoir à expliquer aux instances décisionnaires d’une entreprise qu’un serveur Windows (soumis à licence) sera nécessaire.

Bref, venons-en au fait. Cet article à pour but de décomposer chaque étape de la création d’un job .NET Core en C# et son hébergement dans un container Docker.

Nous allons ici consommer un service REST mettant à disposition le classement LNB pour la ligue de ProA, déserialiser les données pour en avoir une interprétation objet et les enregistrer localement dans un volume exposé dans le container Docker.


Configuration de docker

Création du volume Docker dans lequel nous déposerons le job et où sera enregistré le fichier sérialisé.
docker volume create --name mydata


Ecriture du code

J’utilise Visual Studio 2017 pour réaliser ce job (sources). On commence par créer un nouveau projet Console App (.NET Core)

Une fois le projet lancé, on ajoute le package Nuget Newtonsoft.Json qui nous sera utile pour déserialiser les données distantes.
La source de données qui va nous permettre d’obtenir le classement LNB est située sur parsed.xyz à l’adresse : https://parsed.xyz/res/lnb/ProA_20172018.json

Pour en avoir une représentation objet après téléchargement des données, nous allons écrire une classe simple :

Ensuite le code du job :

Rien de très compliqué ici, on télécharge la ressource distante dans une collection de byte que l’on converti en type string en utilisant l’encodage UTF8. On déserialise ensuite la chaîne dans une collection d’objet ProAClassementItem. On affiche la troisième équipe dans le classement actuel (pour s’assurer que tout est ok) puis on sérialise notre collection cette fois ci dans un fichier binaire.

Un test simple en lançant le job localement : c’est OK !

Il ne nous reste plus qu’à publier notre code localement et à le copier dans le volume mydata exposé dans le container (par défaut dans /var/lib/docker/volumes/mydata/_data).


Exécution dans docker

On créer le container Docker pour héberger le job :
docker run -v mydata:/data -ti microsoft/dotnet:runtime

L’argument -v permet de monter le volume à la racine du container dans le dossier /data, et l’argument -ti nous permet de rendre le conteneur interactif et de rentrer dedans. On se place dans le dossier data, puis on exécute notre job. L’illustration suivante présente toutes les commandes depuis un Docker vierge de toute image.

 

Bingo ! Ce job simple tourne parfaitement dans un environnement .NET Core qu’il soit hébergé sur Windows, Linux ou MacOS ! Une dernière vérification dans le volume nous prouve que le fichier a bien été créé.

À vous de jouer !