首頁

目前文章總數:182 篇

  

最後更新:2025年 05月 31日

0018. 解決 Dotnet Build 錯誤 docker RUN pnpm build FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

日期:2025年 05月 24日

標籤: Jenkins Continuous Integration(CI) Continuous Deployment(CD) Docker Docker-Compose Container Ubuntu Linux

摘要:Jenkins


應用所需:1. jenkins 主機
     2. 已安裝 Docker-Compose Ubuntu 主機
解決問題:Jenkin CICD 部署時,發生錯誤 MSB4166: Child node exited prematurely. Shutting down 的解決方法
相關參考:StakeOverFlow討論
基本介紹:本篇分為 3 大部分。
第一部分:問題描述
第二部分:原因 & 解決方式
第三部分:Demo 結果






第一部分:問題描述

Step 1:CICD 部署報錯 - 1

在執行到 DockerFile 建構 Image 時

RUN pnpm build




Step 2:CICD 部署報錯 - 2

出現關鍵字拋錯 FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory




Step 3:錯誤造成的影響 - 啟動容器失敗

此錯誤造成的影響是可以正常建立出 Docker Image
但是在運行容器時才會發生錯誤




在訪問網站時只會出現 502 ,表示經過的 Nginx 無法正常訪問容器的內容




Step 4:檢查容器 Log

檢查容器 Log ,也只會看到 Error: Cannot find module ‘/app/.output/server/index.mjs’
表示找不到檔案,導致此問題非常難以排查錯誤
※因為 Image 是正常的,Container 也可以運行,但立即失敗,並且錯誤是少檔案
通常會認為是不是 Source Code 有異常,有檔案沒有簽入

docker logs <container_id or container_name>




Step 5:進入容器檢查

基於已存在的容器運行一個臨時容器進行調試,輸入以下指令:

docker run -it --rm market.h5.frontend_image_stg sh


進入後,在輸入以下,對應是否真的沒有資料夾

ls -al .output/server


可以得到 No such file or directory 沒有找到 Run pnpm install 建構的前端框架使用的套件檔案




第二部分:原因 & 解決方式

Step 1:問題根源

默認堆內存限制太小:Node.js 默認的最大堆內存限制通常是 2GB 左右
但是在建構過程前端框架的套件應用有大量的依賴,因此會造成內存不足

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory




Step 2:相關參考

pnpm Issue #6227中,有人提出此問題,並且在下方提供解法
關鍵在設定參數 NODE_OPTIONS=–max_old_space_size=8192

Additional information:
node -v prints: v18.0.0
Windows, macOS, or Linux?: macOS arm64
The Problem can be fixed with export NODE_OPTIONS=--max_old_space_size=8192.
But then it will resolve with a many packages:



Step 3:確定 Docker 機器記憶體

進入 Ubuntu 主機,檢查建構 Docker Build Image 的機器的記憶體空間
以此機器為例,最大值為 8G 可用為 4G ,因此超過 4G 是有可能造成其他異常,設定 4096 MB是最合適的。
※回顧:不設定預設為 2048 MB,目前預設會早成此錯誤發生

free -h




Step 4:解法1 : 直接調整 Docker File

在 DockerFile 第 Step 8. 原本如下:

Run pnpm install


調整成以下:

Run NODE_OPTIONS=--max_old_space_size=4096 pnpm install




Step 5:解法2 : 優化 Jenkins Pipeline

在原本的 Jenkins Pipeline 在執行時,增加替換 DockerFile 檔案的 Step
將檔案 Dockerfile.email 裡面的內容,找到 RUN pnpm build 替換成 RUN NODE_OPTIONS="–max-old-space-size=4096" pnpm build/

sed -i 's/RUN pnpm build/RUN NODE_OPTIONS=\"--max-old-space-size=4096\" pnpm build/' Dockerfile.email






第三部分:Demo 結果

Step 1:執行 Docker Build Image

無論選擇 解法1 or 解法2 最終都可以提高記憶體使用量,因此最終都能順利建構前端框架套件




Step 2:成功產生

建構完 Image 後,在進入容器內檢查,這次有正確產生套件,並且容器也可正常運行,排除 502 GeteWay 錯誤

ls -al .output/server