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.
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
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
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
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
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
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.
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