Docker 镜像运行时 JavaScript 堆内存不足

ram*_*393 20 node.js typescript docker

通常我运行我的应用程序,npm run dev 并且在 package.json 文件中包含如下所示的脚本

"scripts": {
        "dev": "nodemon server.ts",
    }
Run Code Online (Sandbox Code Playgroud)

这里一切正常。

我基于下面的 Dockerfile 构建 docker 镜像

FROM node:14.17-alpine

RUN npm i -g typescript@4.2.4


RUN npm i -g nodemon

RUN apk add g++ make python


WORKDIR /app 

ADD package*.json ./

RUN npm install

ADD . .

CMD npm run dev
Run Code Online (Sandbox Code Playgroud)

我可以使用成功构建图像

 docker build --tag test-backend .
Run Code Online (Sandbox Code Playgroud)

当我看到这张图片时

docker run  -it -p 3003:3003 test-backend
Run Code Online (Sandbox Code Playgroud)

我面临 javascript 堆内存中断

<--- Last few GCs --->

[31:0x55effca3d8e0]    57856 ms: Mark-sweep (reduce) 989.3 (996.6) -> 988.2 (997.9) MB, 1275.1 / 0.0 ms  (average mu = 0.173, current mu = 0.035) allocation failure scavenge might not succeed
[31:0x55effca3d8e0]    59100 ms: Mark-sweep (reduce) 989.3 (999.9) -> 988.5 (999.4) MB, 1206.7 / 0.0 ms  (average mu = 0.107, current mu = 0.030) allocation failure scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
Aborted
[nodemon] app crashed - waiting for file changes before starting...
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?

小智 36

我正在尝试解决同样的问题。基本上,问题的出现是因为该进程正在获取系统允许的更多内存。例如,如果您的计算机有 2GB 内存,则该进程会使可用内存过载。

这种问题,我通过向机器添加一个交换文件来帮助一点内存来解决(也许这篇文章可以帮助你: https: //tecadmin.net/linux-create-swap/),并ENV NODE_OPTIONS=--max_old_space_size=2048在中设置这个环境您Dockerfile限制节点进程将使用的内存。

2048请使用与计算机内存相同的值,而不是。

这个设置对我有用。我希望这些评论能够对您有所帮助。


Ker*_*tam 9

对于 Mac 用户来说!在为环境变量添加以下指令后,我需要从 GUI(交换和内存)增加:

ENV GENERATE_SOURCEMAP=false
ENV NODE_OPTIONS=--max-old-space-size=16384
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述