Creé un nuevo proyecto ASP.net Core 2.1 en Visual Studio 2019. Elegí generar el contenedor Docker Linux y el archivo docker-compose. Todo funciona bien cuando uso VS para ejecutarlo.
El problema aparece cuando trato de ejecutar mi aplicación en un entorno de producción. Para hacer eso, he clonado código git en la máquina linux de targeter. Luego ejecuto docker-compose up en la carpeta de mi proyecto.
Al principio no funcionó porque la aplicación usa HTTPS y no había certificados HTTPS para localhost en la máquina. Necesitaba generar el certificado:
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword En docker-compose.yml , especifiqué un volumen para vincular la carpeta con el certificado a la carpeta dentro del contenedor docker donde mi aplicación busca certificados (última línea del código a continuación).
version: '3.4' services: mongo: # not relevant mongo-express: # not relevant synceddb: image: ${DOCKER_REGISTRY-}synceddb ports: - 13000:13000 - "10002:80" - "44361:443" build: context: . dockerfile: SyncedDB/Dockerfile depends_on: - mongo environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=https://+:443;http://+:80 - ASPNETCORE_HTTPS_PORT=44361 - ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword" - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx volumes: - ${HOME}/.aspnet/https:/https/Dockerfile tiene el siguiente aspecto:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build WORKDIR /src COPY ["SyncedDB/SyncedDB.csproj", "SyncedDB/"] RUN dotnet restore "SyncedDB/SyncedDB.csproj" COPY . . WORKDIR "/src/SyncedDB" RUN dotnet build "SyncedDB.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "SyncedDB.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "SyncedDB.dll"]El problema es: mi aplicación no ve mi certificado (al menos así es como interpreto este error)
crítico: Microsoft.AspNetCore.Server.Kestrel[0]
No se puede iniciar Kestrel.
Interop+Crypto+OpenSslCryptographicException: error:2006D080:rutinas BIO:BIO_new_file:no existe tal archivo
en [...]
Excepción no controlada: Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO rutinas:BIO_nuevo_archivo:no existe tal archivo
[...]
Vale, ¡lo descubrí! Siga los pasos exactos a continuación. Garantizado que esto funcionará para usted... así que aquí va...
en CLI, en el directorio raíz de su aplicación, ejecute los siguientes comandos en el mismo orden que se muestra a continuación:
$ mkdir conf.d $ dotnet dev-certs https --clean $ dotnet dev-certs https -ep ./conf.d/https/dev_cert.pfx -p madison $ dotnet dev-certs https --trustAsegúrese de que el archivo dev_cert.pfx esté disponible en la carpeta ./conf.d/https. Ahora, en su archivo docker-compose, modifique su servicio api para que se vea como se muestra a continuación:
... api: container_name: mad.api build: context: . dockerfile: Dockerfile environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=https://+:443;http://+80 - ASPNETCORE_HTTPS_PORT=44311 - ASPNETCORE_Kestrel__Certificates__Default__Password=madison - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/dev_cert.pfx ports: - "50420:80" - "44361:443" volumes: - ./conf.d/https/:/https/ networks: - mad_network ... $ docker-compose down # Down any previous setup $ docker-compose up --build -d # Build and run containers $ docker-compose ps # Check status of api..make sure its "up" $ docker-compose logs -f api # Check logs¡¡Ahora, prueba cualquiera de estas URL y comprueba que funcionan!! (Nota: es posible que no tenga un punto final de pronóstico del tiempo en su código... use el apropiado o recibirá un 404
http://localhost:50420/pronóstico del tiempo https://localhost:44361/pronóstico del tiempo
(La razón por la que no funcionó para mí fue porque cuando ejecuté dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p { password here } estaba creando el pfx con un nombre extraño en mi directorio raíz y no en la ubicación especificada en el argumento -ep. Ahora estoy usando asp.net core 3.0. Este comando funcionó bien anteriormente en asp.net core 2.2. ¡Así que algo debe haber cambiado entre 2.2 y 3.0! También parece interesante como asp.net core 3.0 se deshizo del proyecto docker-compose, ¡lo cual es una gran bendición! :oren: #bendito)
Finalmente lo arreglé. Dos errores en mi configuración:
1: comillas innecesarias en la contraseña del certificado
Había:
- ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword"Debiera ser:
- ASPNETCORE_Kestrel__Certificates__Default__Password=crypticpassword2: la aplicación estaba buscando un certificado en un lugar equivocado.
Estaba usando docker con sudo , como root, pero generé un certificado usando una cuenta común. Pensé que ${HOME} apuntaría a mi carpeta de inicio, pero en su lugar apuntaba a la carpeta raíz.