Étapes pour exécuter le développement local d'ASP.NET Core sur Mac avec docker-compose

Cette fois, je l'ai essayé avec ASP.NET Core MVC, mais il devrait en être de même pour le projet ASP.NET Core WebAPI

TL;DR Suivez simplement les étapes de la référence Microsoft. Recommandé de lire en anglais. La procédure Windows est également bien organisée ici.

Pourquoi j'ai écrit

Environnement cible, etc.

Mettons en place la procédure

Si vous essayez de tout faire en même temps, vous serez confus lorsque vous trébucherez, il est donc important de le faire dans l'ordre

étape 1

Créez une nouvelle application ASP.NET MVC, etc. et vérifiez le démarrage avec dotnet run

% cd myapp
% dotnet new mvc -o .
% dotnet run

Étape 2

Préparez le Dockerfile suivant et vérifiez le démarrage dans le conteneur Docker via une connexion HTTP.

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY ./myapp.csproj .
RUN dotnet restore

# copy everything else and build app
COPY . ./
WORKDIR /app
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.8-buster-slim AS runtime
WORKDIR /app
COPY --from=build /app/out ./
ENTRYPOINT ["dotnet", "myapp.dll"]

Le Dockerfile ci-dessus est un exemple lorsque le Dockerfile est placé dans la même couche que myapp.csprj. Dans la référence Microsft, il s'agit d'un exemple avec la structure de répertoires suivante (Une méthode de développement est recommandée pour .NET Core pour subdiviser les projets et les gérer collectivement dans des fichiers de solution? L'exemple de Microsoft est donc correct, mais cette fois je voulais le faire dans la même hiérarchie)

Après avoir créé le Dockerfile, confirmez le démarrage par connexion HTTP avec la commande suivante

% docker build -t myapp_image .
% docker run -it --rm -p 5000:80 --name myapp myapp_image

Étape 3

Préparez un certificat auto-signé à l'aide de la commande dotnet dev-certs.

% dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p { password here }
% dotnet dev-certs https --trust

Définissez la partie «{password here}» sur chaque mot de passe.

Bien que cela n'ait rien à voir avec la ligne principale, je n'ai pas remarqué que j'avais fait une erreur dans ce paramètre (`{passward hogefuga} ʻetc. {}) Lorsque je l'ai démarré à l'aide d'un certificat auto-signé, j'ai eu l'erreur suivante et cela n'a pas démarré.

warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {eebd890e-0312-4174-bb70-97f7873df627} may be persisted to storage in unencrypted form.
crit: Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to start Kestrel.
Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
   at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)
   at Internal.Cryptography.Pal.OpenSslX509CertificateReader.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert(ConfigurationReader configReader)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.ValidateOptions()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1application,CancellationTokencancellationToken)
Unhandled exception. Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
   at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)
   at Internal.Cryptography.Pal.OpenSslX509CertificateReader.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert(ConfigurationReader configReader)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.ValidateOptions()
   at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1application,CancellationTokencancellationToken)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at myapp.Program.Main(String[] args) in /app/Program.cs:line 17

Étape 4

Confirmez le démarrage dans le conteneur Docker à l'aide du certificat auto-signé préparé. L'image Docker doit avoir été créée par docker build -t myapp_image . à l'étape 3, donc ci-dessous.

% docker run --rm -it -p 5000:80 -p 5001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v ${HOME}/.aspnet/https:/https/ --name myapp myapp_image

Étape 5

Créez le fichier docker-compose.yml suivant sur le même répertoire et vérifiez le démarrage.

version: '3.8'

services:
  webapp:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:80"
      - "5001:443"
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_Kestrel__Certificates__Default__Password= { passward here }
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
    volumes:
      - ~/.aspnet/https:/https:ro

Remplacez la partie de «{password here}» par le mot de passe du certificat auto-signé que vous avez défini précédemment.

% docker-compose up

l'a fait. À partir de là, comment ajouter un autre middleware à docker-compose.yml n'est pas limité à .NET Core, je vais donc l'omettre.

À propos de mcr.microsoft.com/dotnet/core/sdk:3.1-buster

La formule est J'utilise l'image mcr.microsoft.com/dotnet/core/sdk: 3.1 J'ai utilisé ceci parce que l'image est trop grande. Il existe d'autres images alpines telles que 3.1-alpine, donc si vous êtes intéressé Jetez un œil à DockerHub.

référence:

Recommended Posts

Étapes pour exécuter le développement local d'ASP.NET Core sur Mac avec docker-compose
Étapes pour exécuter Docker sur Mac
Étapes pour créer un environnement de développement Ruby on Rails avec Vagrant
Exécutez Ubuntu + ROS avec Docker sur Mac
Comment résoudre la construction de l'environnement local de Ruby on Rails (MAC)!
Run Edge (version Chromium) sur Mac avec Selenium
Étapes pour configurer Jenkins sur votre Mac local, créer une tâche et réussir
Créer un environnement de développement Java avec VS Code sur Mac
Comment exécuter javafx avec Raspeye publié le 12/07/2020
À partir d'avril 2018 Comment installer Java 8 sur Mac
Exécutez STS4 sur Mac
Utilisation de plusieurs versions de Java avec Brew sur Mac + jEnv
Une série d'étapes pour créer des livrables pour les portefeuilles avec Rails
Notes sur la création de Jitsi Meet sur Azure avec docker-compose
Exécuter un lot avec docker-compose avec Java batch
Exécutez TAO Core avec Docker
[Core ML] Convertissez Cycle GAN en Core ML et exécutez-le sur iOS
J'ai essayé de créer un environnement de développement Spring MVC sur Mac
Comment changer de version Java avec direnv dans le terminal sur Mac
Étapes pour installer Maven sur Mac et l'utiliser avec Eclipse