【问题标题】:Angular on Docker: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memoryDocker 上的 Angular:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足
【发布时间】:2020-03-12 03:21:49
【问题描述】:

我有一个使用 Angular 的 .Net Core 3.0 应用程序,我正在尝试构建一个 docker 映像。

该项目在本地完美执行,但是当我尝试构建映像时,我收到以下错误:

EXEC : FATAL error : Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory [/app/ProjectName.csproj]

这是堆栈跟踪

==== 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

这是 Dockerfile:

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

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

我还能尝试解决什么问题?

【问题讨论】:

    标签: node.js angular docker npm .net-core


    【解决方案1】:

    通过运行命令来安装 nodejs,你正在扼杀 docker 的全部目的。

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

    Docker 有一组基础镜像,这些镜像附带商定的用于运行该系统的安装。

    当您有双重需求(例如同时运行 dotnet core 和 nodejs)时,这会变得很棘手。 我要求您重新考虑您的设计,即如何以及为什么要在同一系统上使用两个不同的应用程序。它们可以在不同的容器上吗?如果是,请务必这样做。

    只要有可用于该服务的基本映像,我也会避免通过命令进行安装。

    请注意,这还不够。您可能还必须设置多个路径变量。 .NET 工作。这只是该方向的一个开端。

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

    【讨论】:

    • 我使用的是通过命令行新建dotnet项目时生成的结构。我对 docker 没有太多经验,但我认为这是推荐的方法。你认为如果我将后端和前端分开保存会更好吗?如果是这样,我应该创建两个不同的 dockerfile 并通过 docker-compose 运行所有内容?
    • 容器应该是最小的独立功能。当您需要多个不同的图像时,有些用例可能是推荐的处理方式。
    猜你喜欢
    • 2022-10-06
    • 1970-01-01
    • 2020-05-14
    • 2021-05-06
    • 2021-10-20
    • 2020-03-13
    • 2020-08-22
    • 2023-02-20
    • 2021-06-10
    相关资源
    最近更新 更多