ATUALIZAÇÃO de 24.07.2019 ver no final do artigo.
ATUALIZAÇÃO de 01/11/2018 {
Graças à ajuda dos comentários, abaixo está uma versão mais ideologicamente correta do arquivo docker.
O modelo de projeto padrão do Angular SPA Template contém um erro. Desenvolvedores na versão net .core 2.1. removido da imagem microsoft / dotnet: 2.1-sdk usada para criar nodejs, mas o código que a utiliza permaneceu no arquivo do projeto. Leia mais aqui
github.com/aspnet/Announcements/issues/298Você deve editar manualmente o arquivo de projeto * .csproj excluindo o seguinte código
Código para remover do * .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>
Arquivo docker correto 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"]
}
Infelizmente, não encontrei uma solução pronta em nenhum lugar. Eu tive que compilar informações de várias fontes. Para iniciar o aplicativo na janela de encaixe Angular 6/7 como um projeto no ASP .NET Core.
Se ativarmos o suporte do docker para um projeto com um aplicativo Angular usando ferramentas padrão, o arquivo docker criará uma imagem do aplicativo com base na imagem microsoft / dotnet: 2.1-aspnetcore-runtime. Nenhum servidor node.js está incluído nesta imagem base E o resultado da execução será um erro do 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

Para resolver esse erro, é necessário atualizar o arquivo do Docker adicionando o node.js de instalação e o angular.
Além disso, como o desenvolvimento está no Windows e tudo começa em um contêiner do Docker baseado no Ubunty, se forem usados arquivos de estilo scss ou sass, eles serão compilados pela CLI Angular usando o node-sass e, ao iniciar, ocorrerão um erro “O Node Sass não ainda suporta o seu ambiente atual: Windows de 64 bits com tempo de execução não suportado ". Você deve executar o comando:
npm rebuild node-sass
O npm fará o download dos scripts necessários para a plataforma atual e reconstruirá os arquivos css.
O arquivo final do Docker para um aplicativo Angular baseado em um projeto ASP .NET Core 2.1 é o seguinte
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"]
Usei a versão LTS estável do Node.js, atualmente 8.x, mas pode ser alterada para qualquer mais relevante.
Além disso, também observo que o Windows perdoa erros associados a um caso diferente de caracteres, mas o Linux não perdoa isso. E o projeto que funcionou durante o desenvolvimento se recusará a compilar no contêiner, dando um erro
docker ERROR in error TS1149: File name 'filename.ts' differs from already included file name 'FileNames.ts' only in casing
Para evitar esses erros, mesmo no estágio de compilação, recomendo adicionar a opção apropriada "forceConsistentCasingInFileNames": true ao arquivo tsconfig.json na seção compilerOptions
{ "compilerOptions": { "forceConsistentCasingInFileNames": true } } }
ATUALIZAÇÃO de 24.07.2019 {
Novamente,
graças à ajuda nos comentários, a versão otimizada do arquivo docker é apresentada abaixo.
Arquivo docker otimizado 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, janela de encaixe