Docker distribuire un'app Asp.NET Core

in Architettura Software, Informatica

Distribuire un’app Asp.NET Core con Docker (parte 1)

Reading Time: 2 minutes

Docker è un’insieme di tecnologie di virtualizzazione che consentono di deployare rapidamente pacchetti software. Docker non implementa un sistema basato su virtual machines, ma una struttura di containers che si trovano direttamente sopra al kernel del sistema sottostante. Questo tipo di architettura consente a Docker di essere molto più “leggero” e di eseguire numerosi containers all’interno di una singola host machine.

Riprendendo i concetti dal post precedente, verranno analizzati i passaggi necessari per la creazione di un’immagine contenente un’applicazione ASP.Net Core.

La “ricetta” contenente le dipendenze ed il codice che dovrà essere inserito all’interno di un container vengono definite all’interno di un file, chiamato DockerFile. Il risultato della “compilazione” di un DockerFile è una nuova immagine.

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /src
COPY ["MyProject.csproj", "./"]
RUN dotnet restore "./MyProject.csproj"
COPY . .
RUN dotnet build "MyProject.csproj" -c Release -o /app

Analizziamo il DockerFile precedente:

FROM : viene indicato quale immagine deve essere utilizzata all’interno del container. L’immagine è uno snapshot compresso di un file-system. La “ricetta” inserita all’interno del DockerFile è costituita da una serie di steps che devono essere eseguiti per poter includere all’interno dell’immagine base l’applicazione da deployare.

  • WORKDIR: è la cartella utilizzata per l’esecuzione dei comandi
  • COPY: indicata a docker di copiare i file dal filesystem locale all’immagine
  • RUN: esegue il comando indicato come parametro

Nell’esempio l’immagine di docker sarà basata su dotnet/core/sdk (presente sul repository mcr.microsoft.com). Docker coperà il file del progetto dal pc locale ed effettuare il restore di tutte le dipendenze. Una volta effettuato il restore delle dipendenze, verrà creata una build (RELEASE) dell’applicazione e posizionata all’interno di /app.

Rimuovere Asp.NET Core Development Tools dall’immagine

Durante le fasi di build dell’immagine, spesso vengono scaricate dipendenze non necessarie, che possono appesantire l’immagine (e quindi il container). Oltre a rimuovere le dipendenze non necessarie è necessario rimuovere anche i tool di sviluppo, che potrebbero generare conflitti e/o aprire rischi di sicurezza. Nel caso dell’immagine utilizzata, sono contenuti alcune tool di sviluppo, che dovranno essere rimossi.

FROM build AS publish
RUN dotnet publish "MyProject.csproj" -c Release -o /app

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
WORKDIR /app
EXPOSE 5001

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyProject.dll"]

Sono state apportate alcune modifiche al DockerFile precedente. Per prima cosa è stata inserita la parola chiave AS nel FROM. Gli steps che sono eseguiti:

  • viene utilizzata l’immagine SDK per creare una build (RELEASE). Questo passaggio viene chiamato “build”
  • viene utilizzata l’immagine “build ” per pubblicare l’applicazione nella cartella app/. Questo passaggio viene chiamato “publish”
  • viene scaricata l’immagine di ASP.NET Core con i soli componenti runtime. Questo passaggio viene chiamato “base”
  • Viene utilizzata l’immagine “base” copianto il contenuto della cartella app/ da publish. Questo passaggio viene chiamato “final”

In questo modo il DockerFile utilizzata l’immagine SDK per effettuare la build dell’applicazione sostituendo l’immagine base con una runtime.