Docker ci permette di creare ambienti di sviluppo (ed ovviamente anche di produzione) molto rapidamente, fornendo la possibilità di creare un vero e proprio ambiente con pochissimi passi.
In questo post creerò l’ambiente per lo sviluppo di applicazioni ASP.NET core integrato con Sql Server.
Considerando che ogni volta che viene creato un nuovo container vengono di fatto cancellati i dati presenti al suo interno, sarà necessario configurare per Sql Server un volume, in modo da poter persistere i dati.
Per quanto riguarda invece l’applicativo scritto in ASP.NET Core non sarà necessario perchè verrà rilasciata una nuova immagini ad ogni build.
Partiamo subito con la parte relativa a ASP.NET Core. In questo caso andremo ad utilizzare .net core 7.0, e quindi avremo la necessità di scaricare l’immagine da docker hub.
Il modo piu’ semplice per poter utilizzare l’immagine è quello di utilizzare il comando:
docker run -v ${PWD}:/app --workdir /app mcr.microsoft.com/dotnet/sdk:7.0 dotnet new webapiIn un unico comando viene indicato di utilizzare un volume per /app, impostarlo come workdir, scaricare l’immagine se non è presente ed eseguire il comando
dotnet new webapi
che consente di creare una webapi dal template di .net core all’interno della workdir.
A questo punto abbiamo tutto quello che ci serve poter utilizzare il nostro container per la web api.
Da notare che per il posizionamento del volume viene utilizzata la variabile PWD che indica il path assoluto della cartella dalla quale viene eseguito il comando.
Non ci limitiamo però all’utilizzo della riga comando: quello che vogliamo fare è la creazione di un dockerfile che contenga tutte le istruzioni per la creazione della nostra immagine.
Il metodo per creare l’immagine a partire dall’applicazione .net core è quello di impostare un ambiente, copiare al suo interno il sorgente dell’applicazione, procedere con la build ed utilizzare il risultato della build come contenuto dell’immagine finale.
In questo modo verrano creati degli step intermedi per la generazione dell’immagine finale.
Iniziamo con lo scaricamento ed il setup dell’immagine che chiamermo “base”:
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80
Nello specifico viene scaricata l’immagine, viene impostata la workir e viene esposta all’esterno del container la porta 80. In questo esempio si utilizza la porta 80, quindi senza certificato ssl.
E’ comunque possibile creare un certificato ed utilizzando esponendo la porta 443.
Successivamente procediamo con l’utilizzo di un nuova immagine che denominermo “build” utilizzata per la generazione della build:
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["app.csproj", "./"] RUN dotnet restore "./app.csproj" COPY . . RUN dotnet build "app.csproj" -c Release -o /app
I passi che verranno eseguiti sono:
- Viene impostata la workdir all’interno dell’immagine, impostandola nella cartella /src.
- Viene copiato il file app.csproj all’interno della workdir.
- Viere effettuato il restore in base al contenuto del file app.csproj
- Viene copiato tutto il contenuto dall’esterno verso l’interno
- Viene effettuata la creazione della build in modalità release e copiata all’interno della cartella /app
A questo punto non rimane che creare l’immagine finale, con al suo interno solo quello che l’app ha bisogno per essere eseguita, ovvero il risultato della build:.
FROM build AS publish RUN dotnet publish "app.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "app.dll"]
Si procede quindi con la pubblicazione della build all’interno della cartella /app, con il comando dotnet publish.
Una volta pubblicata è necessario generare la nuova immagine, denominata final che utilizza la workdir /app copiando dall’immagine publish e definendo l’entry point con:
ENTRYPOINT ["dotnet", "app.dll"]
In questo modo è stato generato il docker file per l’esecuzione dell’immagine finale della nostra applicazione.
Ecco il dockerfile finale:
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["app.csproj", "./"] RUN dotnet restore "./app.csproj" COPY . . RUN dotnet build "app.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "app.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "app.dll"]