Contenedorizaci贸n de aplicaciones Angular 6 SPA Template ASP .NET Core 2.1

ACTUALIZACI脫N del 24/07/2019 ver al final del art铆culo.

ACTUALIZACI脫N del 11/01/2018 {
Gracias a la ayuda en los comentarios, a continuaci贸n hay una versi贸n m谩s ideol贸gicamente correcta del archivo acoplable.

La plantilla de proyecto est谩ndar de Angular SPA Template contiene un error. Desarrolladores en la versi贸n net .core 2.1. eliminado de la imagen de microsoft / dotnet: 2.1-sdk usada para construir nodejs, pero el c贸digo que la usa permaneci贸 en el archivo del proyecto. Lea m谩s aqu铆 github.com/aspnet/Announcements/issues/298
Debe editar manualmente el archivo de proyecto * .csproj eliminando el siguiente c贸digo
C贸digo para eliminar de * .csproj
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish"> <!-- As part of publishing, ensure the JS resources are freshly built in production mode --> <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" /> <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build -- --prod" /> <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build:ssr -- --prod" Condition=" '$(BuildServerSideRenderer)' == 'true' " /> <!-- Include the newly-built files in the publish output --> <ItemGroup> <DistFiles Include="$(SpaRoot)dist\**; $(SpaRoot)dist-server\**" /> <DistFiles Include="$(SpaRoot)node_modules\**" Condition="'$(BuildServerSideRenderer)' == 'true'" /> <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)"> <RelativePath>%(DistFiles.Identity)</RelativePath> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </ResolvedFileToPublish> </ItemGroup> </Target> 


Corregir dockerfile
 ARG NODE_IMAGE=node:8.12 FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["AngularWebApp/AngularWebApp.csproj", "AngularWebApp/"] RUN dotnet restore "AngularWebApp/AngularWebApp.csproj" COPY . . WORKDIR "/src/AngularWebApp" FROM ${NODE_IMAGE} as node-build WORKDIR /src COPY AngularWebApp/ClientApp . RUN npm install RUN npm run build -- --prod FROM build AS publish RUN dotnet publish "AngularWebApp.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . COPY --from=node-build /src/dist ./ClientApp/dist ENTRYPOINT ["dotnet", "AngularWebApp.dll"] 


}

Desafortunadamente, no he encontrado una soluci贸n preparada en ninguna parte. Tuve que recopilar informaci贸n de varias fuentes. Para iniciar la aplicaci贸n en Docker Angular 6/7 como proyecto en ASP .NET Core.

Si habilitamos el soporte de Docker para un proyecto con una aplicaci贸n Angular utilizando herramientas est谩ndar, el archivo Docker crear谩 una imagen de la aplicaci贸n basada en microsoft / dotnet: imagen 2.1-aspnetcore-runtime. No se incluye ning煤n servidor node.js en esta imagen base Y el resultado de la ejecuci贸n ser谩 un error ASP .NET Core


 An unhandled exception occurred while processing the request. The NPM script 'start' exited without indicating that the Angular CLI was listening for requests 

imagen

Para resolver este error, debe actualizar el archivo Docker agregando la instalaci贸n node.js y angular.
Adem谩s, dado que el desarrollo est谩 bajo Windows, y todo comienza en un contenedor Docker basado en Ubunty, si se usan archivos de estilo scss o sass, son compilados por la CLI Angular usando node-sass, y al iniciar, da un error "Node Sass no pero admite su entorno actual: Windows de 64 bits con tiempo de ejecuci贸n no compatible ". Debes ejecutar el comando:

 npm rebuild node-sass 

npm descargar谩 los scripts necesarios para la plataforma actual y reconstruir谩 los archivos css.

El archivo final de Docker para una aplicaci贸n angular basada en un proyecto ASP .NET Core 2.1 es el siguiente

 FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base # Setup NodeJs RUN apt-get update && \ apt-get install -y wget && \ apt-get install -y gnupg2 && \ wget -qO- https://deb.nodesource.com/setup_8.x | bash - && \ apt-get install -y build-essential nodejs RUN npm install @angular/cli -g # End setup WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["AngularWebApp/AngularWebApp.csproj", "AngularWebApp/"] RUN dotnet restore "AngularWebApp/AngularWebApp.csproj" COPY . . WORKDIR "/src/AngularWebApp" RUN dotnet build "AngularWebApp.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "AngularWebApp.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . WORKDIR /app/ClientApp RUN npm install RUN npm rebuild node-sass WORKDIR /app ENTRYPOINT ["dotnet", "AngularWebApp.dll"] 

Utilic茅 la versi贸n estable LTS de Node.js, actualmente 8.x, pero se puede cambiar a una m谩s relevante.

Adem谩s, tambi茅n noto que Windows perdona los errores asociados con un caso de car谩cter diferente, pero Linux no lo perdona. Y el proyecto que funcion贸 durante el desarrollo se negar谩 a compilar en el contenedor, dando un error

 docker ERROR in error TS1149: File name 'filename.ts' differs from already included file name 'FileNames.ts' only in casing 

Para evitar tales errores incluso en la etapa de compilaci贸n, recomiendo agregar la opci贸n apropiada "forceConsistentCasingInFileNames": verdadero al archivo tsconfig.json en la secci贸n compilerOptions

 { "compilerOptions": { "forceConsistentCasingInFileNames": true } } } 


ACTUALIZACI脫N del 24/07/2019 {
Nuevamente, gracias a la ayuda en los comentarios, la versi贸n optimizada del archivo acoplable se presenta a continuaci贸n.
Dockerfile optimizado
 ARG NODE_IMAGE=node:10.16.0 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build WORKDIR /src COPY ["AngularWebApp/AngularWebApp.csproj", "AngularWebApp/"] RUN dotnet restore "AngularWebApp/AngularWebApp.csproj" COPY . . WORKDIR "/src/AngularWebApp" RUN dotnet build "AngularWebApp.csproj" -c Release -o /app RUN dotnet publish "AngularWebApp.csproj" -c Release -o /app FROM ${NODE_IMAGE} as node-build WORKDIR /src COPY AngularWebApp/ClientApp . RUN npm install RUN npm rebuild node-sass RUN npm run build -- --prod FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base WORKDIR /app EXPOSE 80 COPY --from=build /app . COPY --from=node-build /src/dist ./ClientApp/dist ENTRYPOINT ["dotnet", "AngularWebApp.dll"] 


}

angular, angular6 / 7, asp .net core 2.1, docker

Source: https://habr.com/ru/post/es428107/


All Articles