Angular 6 SPAテンプレートASP .NET Core 2.1アプリケーションのコンテナー化

2019年7月24日からの更新は、記事の最後をご覧ください。



11/01/2018からの更新{

コメント内の助けのおかげで、以下はdockerファイルのよりイデオロギー的に正しいバージョンです。



標準のAngular SPA Templateプロジェクトテンプレートにはエラーが含まれています。 バージョンnet .core 2.1の開発者。 microsoft / dotnetから削除:nodejsのビルドに使用される2.1-sdkイメージが、それを使用するコードはプロジェクトファイルに残りました。 詳細はこちらgithub.com/aspnet/Announcements/issues/298

次のコードを削除して、* .csprojプロジェクトファイルを手動で編集する必要があります。

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







正しい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"]
      
      







}



残念ながら、既製のソリューションはどこにも見つかりませんでした。 いくつかのソースから情報を収集する必要がありました。 ASP .NET CoreでAngular 6/7 Dockerアプリケーションをプロジェクトとして実行するには。



標準ツールを使用して、Angularアプリケーションでプロジェクトのdockerサポートを有効にすると、dockerファイルはmicrosoft / dotnet:2.1-aspnetcore-runtime imageに基づいてアプリケーションイメージを作成します。 このベースイメージにはnode.jsサーバーは含まれていません 結果は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
      
      





画像



このエラーを解決するには、インストールnode.jsとangularを追加してDockerファイルを更新する必要があります。

さらに、開発はWindowsで行われ、Ubuntyに基づくDockerコンテナーですべてが開始されるため、scssまたはsassスタイルファイルが使用されている場合、それらはnode-sassを使用してAngular CLIによってコンパイルされ、開始時に「Node Sass does notまだ現在の環境をサポートしています:サポートされていないランタイムを備えたWindows 64ビット」 次のコマンドを実行する必要があります。



 npm rebuild node-sass
      
      





npmは、現在のプラットフォームに必要なスクリプトをダウンロードし、cssファイルを再構築します。



ASP .NET Core 2.1プロジェクトに基づくAngularアプリケーションの最終的なDockerファイルは次のとおりです



 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"]
      
      





Node.jsの安定版LTSリリース(現在は8.x)を使用しましたが、より適切なものに変更できます。



さらに、Windowsは文字の異なるケースに関連するエラーを許容しますが、Linuxはこれを許しません。 また、開発中に機能したプロジェクトは、コンテナでのコンパイルを拒否し、エラーが発生します



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





コンパイル段階でこのようなエラーを回避するには、compilerOptionsセクションのtsconfig.jsonファイルに対応するオプション「forceConsistentCasingInFileNames」:trueを追加することをお勧めします



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







2019年7月24日からの更新{

繰り返しになりますが、コメントのヘルプのおかげで、dockerファイルの最適化されたバージョンを以下に示します。

最適化されたdockerfile
 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"]
      
      







}



アンギュラー、angular6 / 7、asp.netコア2.1、ドッカー



All Articles