Schritte zum Ausführen der lokalen Entwicklung von ASP.NET Core auf einem Mac mit Docker-Compose

Dieses Mal habe ich es mit ASP.NET Core MVC versucht, aber es sollte für ASP.NET Core WebAPI-Projekt dasselbe sein

TL;DR Befolgen Sie einfach die Schritte in der Microsoft-Referenz. Empfohlen, auf Englisch zu lesen. Auch hier ist die Windows-Prozedur gut organisiert.

Warum ich geschrieben habe

Zielumgebung usw.

Lassen Sie uns die Prozedur einrichten

Wenn Sie versuchen, alles auf einmal zu tun, werden Sie verwirrt sein, wenn Sie stolpern. Daher ist es wichtig, dies in der richtigen Reihenfolge zu tun

Schritt 1

Erstellen Sie eine neue ASP.NET MVC-App usw. und überprüfen Sie den Start mit "dotnet run"

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

Schritt 2

Bereiten Sie die folgende Docker-Datei vor und überprüfen Sie den Start im Docker-Container über eine HTTP-Verbindung.

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"]

Die obige Docker-Datei ist ein Beispiel, wenn die Docker-Datei in derselben Ebene wie myapp.csprj platziert ist. In der Microsft-Referenz handelt es sich um ein Beispiel mit der folgenden Verzeichnisstruktur (Für .NET Core wird eine Entwicklungsmethode empfohlen, um Projekte zu unterteilen und gemeinsam in Lösungsdateien zu verwalten. Das Beispiel von Microsoft ist also korrekt, aber diesmal wollte ich es in derselben Hierarchie ausführen.)

Bestätigen Sie nach dem Erstellen der Docker-Datei den Start über eine HTTP-Verbindung mit dem folgenden Befehl

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

Schritt 3

Bereiten Sie ein selbstsigniertes Zertifikat mit dem Befehl dotnet dev-certs vor.

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

Setzen Sie den Teil von "{Passwort hier}" auf jedes Passwort.

Obwohl es nichts mit der Hauptzeile zu tun hat, habe ich nicht bemerkt, dass ich in dieser Einstellung einen Fehler gemacht habe ({passward hogefuga} etc. {}) Beim Starten mit einem selbstsignierten Zertifikat wurde der folgende Fehler angezeigt und nicht gestartet.

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

Schritt 4

Bestätigen Sie den Start im Docker-Container mit dem vorbereiteten selbstsignierten Zertifikat. Das Docker-Image sollte von "Docker Build -t myapp_image" in Schritt 3 erstellt worden sein.

% 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

Schritt 5

Erstellen Sie die folgende docker-compose.yml im selben Verzeichnis und überprüfen Sie den Start.

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

Ändern Sie den Teil von "{Passwort hier}" in das Passwort des zuvor festgelegten selbstsignierten Zertifikats.

% docker-compose up

erledigt. Von nun an ist das Hinzufügen anderer Middleware zu docker-compose.yml nicht mehr auf .NET Core beschränkt, daher werde ich darauf verzichten.

Über mcr.microsoft.com/dotnet/core/sdk:3.1-buster

Die Formel lautet Ich verwende das Bild "mcr.microsoft.com/dotnet/core/sdk: 3.1" Ich habe dies verwendet, weil das Bild zu groß ist. Es gibt andere alpine Bilder wie "3.1-alpine", also wenn Sie interessiert sind Schauen Sie sich DockerHub an.

Referenz:

Recommended Posts

Schritte zum Ausführen der lokalen Entwicklung von ASP.NET Core auf einem Mac mit Docker-Compose
Schritte zum Ausführen von Docker auf einem Mac
Schritte zum Erstellen einer Ruby on Rails-Entwicklungsumgebung mit Vagrant
Führen Sie Ubuntu + ROS mit Docker auf dem Mac aus
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
Führen Sie Edge (Chromium-Version) auf einem Mac mit Selen aus
Schritte zum Einrichten von Jenkins auf Ihrem lokalen Mac, Erstellen eines Jobs und Erfolg
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code auf dem Mac
Wie man javafx mit Raspeye ausführt veröffentlicht am 12.07.2020
Stand April 2018 So installieren Sie Java 8 auf einem Mac
Führen Sie STS4 auf dem Mac aus
Verwenden mehrerer Java-Versionen mit Brew auf Mac + jEnv
Eine Reihe von Schritten zum Erstellen von Ergebnissen für Portfolios mit Rails
Hinweise zum Erstellen von Jitsi Meet on Azure mit Docker-Compose
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
Führen Sie TAO Core mit Docker aus
[Core ML] Konvertieren Sie Cycle GAN in Core ML und führen Sie es unter iOS aus
Ich habe versucht, eine Spring MVC-Entwicklungsumgebung auf einem Mac zu erstellen
So wechseln Sie die Java-Version mit direnv im Terminal auf dem Mac
Schritte zum Installieren von Maven auf einem Mac und zur Verwendung mit Eclipse