Publier une image Docker sur Docker Hub via Azure DevOps

Photo by Ian Taylor on Unsplash

Publier une image Docker sur Docker Hub via Azure DevOps

avril 2, 2019

Coucou les pipous, au programme un tuto tout naze sur l’excellent Azure DevOps et l’ingénieux Docker !

Pré-requis

Docker CE

un compte Docker hub

Visual Studio 2017 avec l’extension docker

un compte Azure DevOps (VSTS)

Activer les fin de lignes UNIX dans Visual Studio

Les fichiers Dockerfile & docker-compose utilisent les fins de lignes UNIX voici comment les activer (une autre solution consiste à éditer et créer les fichiers dans un autre éditeur tel que Notepad++)

Outils > Personnaliser

Onglet Commande

Dans “Barre de menu” sélectionnez “fichier”

Cliquez “Ajouter une commande”

Categorie “fichier”

Sélectionner “Option d’enregistrement avancées”

Au programme

  1. Développement d’une application Web basique sur Visual Studio
  2. Préparation du Dockerfile
  3. Création du pipeline de Build sur Azure DevOps

Création du site ASP. NET CORE

Dans visual Studio créer un nouveau projet Asp.Net core type Web api ou MVC.
Cocher la case support docker et sélectionner container linux

Le projet généré, est normalement fonctionnel,vous constaterez la présence d’un fichier Dockerfile :

Vérifier que tout fonctionne en lançant le debug.
Du coté Azure DevOps, ce n’est pas aussi simple, tel quel,l’agent de build n’arrivera pas a compiler l’image et vous obtiendrez l’erreur suivante :

COPY failed: stat ***/Docker/publish: no such file or directory /usr/bin/docker failed with return code: 1

Pour résoudre ce problème, il faut un dockerfile un peu différent de celui généré.

Pour ce faire, créez un nouveau dockerfile, appelez le par exemple Dockerfile.CI, il devrait apparaître comme un sous élément de votre docker file existant.Il est basé sur la solution proposé dans la Documentation Docker

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env WORKDIR /app # Copy csproj and restore as distinct layers COPY *.csproj ./ RUN dotnet restore # Copy everything else and build COPY . ./ RUN dotnet publish -c Release -o out # Build runtime image FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 WORKDIR /app EXPOSE 80 COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "tutodemo.dll"]

Pensez à adapter le fichier à votre solution, en particulier l’ ENTRYPOINT ainsi que les ports exposés,etc..

La différence avec l’existant, c’est que la compilation est réalisé dans un conteneur, le résultat est ensuite copié dans l’image docker finale :

  • Le runtime .net core
  • le code de l’application

Préparation du pipeline de build sur Azure DevOps

Premièrement ajoutez votre solution a un repo vsts de votre choix, committez.
Dans la section build créez une nouvelle définition de build basée sur le template docker container, par défaut la build sera effectué sur l’agent Hosted Ubuntu

Tache Build

Connection à Docker Hub

Dans container registry type selectionnez container registry,
ajouter une connection à docker hub en cliquant sur new, renseigner vos identifiants.

Build Command

Modifier le champs dockerfile pour qu’il pointe vers notre fichier Dockerfile.CI de la sorte : **/Dockerfile.CI
C'est tout pour la build !

Tâche Tag (optionnel)

Cette tâche est optionnel si vous poussez votre image avec un tag existant ou le tag latest Ajoutez une tache entre celle de Build & Push.

Sur cette nouvelle tâche sélectionnez la connexion au hub précédemment créée, puis dans command sélectionnez tag et c’est tout.

Tâche Push

Renseignez la connection au Docker Hub, vous pouvez en suite lancer la build via save & queue.

Si tout se déroule comme prévu, coté vsts vous devriez avoir du vert partout ;) :

Et coté Docker Hub, un nouveau repo et contenant l’image tagué (pour moi avec le numéro de build) :

La suite c’est du classique il suffit de pull & run sur n’importe quel environnement exécutant docker ! FABULOUS !!!

A+ pour d’autres tutos de merde !

Originally published at blogg.codemylife.dev on April 2, 2019.