Node.js Docker上的Angular:堆限制附近的标记压缩无效分配失败-JavaScript堆内存不足

Node.js Docker上的Angular:堆限制附近的标记压缩无效分配失败-JavaScript堆内存不足,node.js,angular,docker,npm,.net-core,Node.js,Angular,Docker,Npm,.net Core,我有一个使用Angular的.NETCore3.0应用程序,我正在尝试构建一个docker映像 该项目在本地执行得非常完美,但一旦我尝试构建映像,就会出现以下错误: EXEC:致命错误:无效的标记压缩接近堆限制分配失败-JavaScript堆内存不足[/app/ProjectName.csproj] 这是StackTrace ==== JS stack trace ========================================= 0: ExitFrame [pc:

我有一个使用Angular的.NETCore3.0应用程序,我正在尝试构建一个docker映像

该项目在本地执行得非常完美,但一旦我尝试构建映像,就会出现以下错误:

EXEC:致命错误:无效的标记压缩接近堆限制分配失败-JavaScript堆内存不足[/app/ProjectName.csproj]

这是StackTrace

==== JS stack trace =========================================

      0: ExitFrame [pc: 0x13725d9]
      1: StubFrame [pc: 0x13da3dc]
  Security context: 0x02e7023c08a1 <JSObject>
      2: /* anonymous */(aka /* anonymous */) [0x30e7252b31e9] [/app/ClientApp/node_modules/terser/dist/bundle.min.js:1] [bytecode=0x23cc07acc7d1 offset=0](this=0x3bde677004a9 <undefined>,0x30e7252b3229 <JSFunction (sfi = 0x23cc07acc479)>)
      3: E(aka E) [0x1f4ce3e9071] [/app/ClientApp/node_modules/terser/dist/bundle.min.js:1] [byt...

   1: 0x9d8da0 node::Abort() [ng build --prod --prod]
   2: 0x9d9f56 node::OnFatalError(char const*, char const*) [ng build --prod --prod]
   3: 0xb37dbe v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [ng build --prod --prod]
   4: 0xb38139 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [ng build --prod --prod]
   5: 0xce34f5  [ng build --prod --prod]
   6: 0xce3b86 v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [ng build --prod --prod]
   7: 0xcefa1a v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [ng build --prod --prod]
   8: 0xcf0925 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [ng build --prod --prod]
   9: 0xcf3338 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [ng build --prod --prod]
  10: 0xcba158 v8::internal::Factory::NewFixedArray(int, v8::internal::AllocationType) [ng build --prod --prod]
  11: 0xe0130d v8::internal::DeoptimizationData::New(v8::internal::Isolate*, int, v8::internal::AllocationType) [ng build --prod --prod]
  12: 0x197ebd4 v8::internal::compiler::CodeGenerator::GenerateDeoptimizationData() [ng build --prod --prod]
  13: 0x197f2d5 v8::internal::compiler::CodeGenerator::FinalizeCode() [ng build --prod --prod]
  14: 0x19f8c8d v8::internal::compiler::PipelineImpl::FinalizeCode(bool) [ng build --prod --prod]
  15: 0x19f9e40 v8::internal::compiler::PipelineCompilationJob::FinalizeJobImpl(v8::internal::Isolate*) [ng build --prod --prod]
  16: 0xc0ef80 v8::internal::OptimizedCompilationJob::FinalizeJob(v8::internal::Isolate*) [ng build --prod --prod]
  17: 0xc12823 v8::internal::Compiler::FinalizeOptimizedCompilationJob(v8::internal::OptimizedCompilationJob*, v8::internal::Isolate*) [ng build --prod --prod]
  18: 0xc37f46 v8::internal::OptimizingCompileDispatcher::InstallOptimizedFunctions() [ng build --prod --prod]
  19: 0xca0e7c v8::internal::StackGuard::HandleInterrupts() [ng build --prod --prod]
  20: 0xfef887 v8::internal::Runtime_StackGuard(int, unsigned long*, v8::internal::Isolate*) [ng build --prod --prod]
  21: 0x13725d9  [ng build --prod --prod]
  Aborted
  npm ERR! code ELIFECYCLE
  npm ERR! errno 134
  npm ERR! metronic-angular@6.1.4 build: `ng build --prod "--prod"`
  npm ERR! Exit status 134
  npm ERR! 
  npm ERR! Failed at the metronic-angular@6.1.4 build script.
  npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

  npm ERR! A complete log of this run can be found in:
  npm ERR!     /root/.npm/_logs/2019-11-15T21_42_53_010Z-debug.log
/app/ProjectName.csproj(39,5): error MSB3073: The command "npm run build -- --prod" exited with code 134.
The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1

我已经尝试将节点最大旧空间增加到64mb,但没有成功。如果我在创建运行
dotnet new angular…
的项目时保留初始模板,我也可以完美地构建docker图像,但是在我从我购买的主题(Metronic)复制文件后,错误就会出现


我还可以尝试解决什么问题?

通过运行命令来安装nodejs,您正在扼杀docker的全部用途

Docker应该消除开发人员安装库、包和软件的依赖性,因为他们认为这是完成工作所必需的

Docker有一组基本映像,这些映像与运行该系统的商定安装一起提供

当您同时需要运行dotnetcore和nodejs这样的双重需求时,这就变得很棘手了。   我请求您重新考虑一下您的设计,即您希望在同一个系统上使用两个不同的应用程序的方式和原因。它们可能在不同的容器上吗?如果是,一定要这样做

我还避免通过命令进行安装,因为有一个基本映像可用于该服务

请注意,这还不够。您可能还必须设置多个路径变量。让.NET工作。这只是朝那个方向发展的开端。
我使用的是通过命令行创建新的dotnet项目时生成的结构。我对docker没有太多经验,但我认为这是推荐的方法。你认为我把后端和前端分开比较好吗?如果是这样的话,我应该创建两个不同的DockerFile并通过docker compose运行所有内容?容器应该是最小的独立功能。在一些用例中,您可能需要多个不同的图像,但这可能是处理此问题的推荐方法。
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
EXPOSE 80

# Setup NodeJs
RUN apt-get update && \
    apt-get install -y wget && \
    apt-get install -y gnupg2 && \
    wget -qO- https://deb.nodesource.com/setup_12.x | bash - && \
    apt-get install -y build-essential nodejs

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "ProjectName.dll"]
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
 
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ./WebApplication.csproj ./
RUN dotnet restore WebApplication.csproj
COPY . .
RUN dotnet build WebApplication.csproj -c Release -o /app/build
 
FROM build AS publish
RUN dotnet publish ./WebApplication.csproj -c Release -o /app/publish
 
FROM node:alpine AS nodewebapp
WORKDIR /app
RUN npm install
COPY . .
 
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY --from=nodewebapp /app .
ENTRYPOINT ["dotnet", "WebApplication.dll"]