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