分享程式代碼相關筆記
目前文章總數:182 篇
最後更新:2025年 05月 31日
在執行到 DockerFile 建構 Image 時
RUN pnpm build
出現關鍵字拋錯 FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
此錯誤造成的影響是可以正常建立出 Docker Image
但是在運行容器時才會發生錯誤
在訪問網站時只會出現 502 ,表示經過的 Nginx 無法正常訪問容器的內容
檢查容器 Log ,也只會看到 Error: Cannot find module ‘/app/.output/server/index.mjs’
表示找不到檔案,導致此問題非常難以排查錯誤
※因為 Image 是正常的,Container 也可以運行,但立即失敗,並且錯誤是少檔案
通常會認為是不是 Source Code 有異常,有檔案沒有簽入
docker logs <container_id or container_name>
基於已存在的容器運行一個臨時容器進行調試,輸入以下指令:
docker run -it --rm market.h5.frontend_image_stg sh
進入後,在輸入以下,對應是否真的沒有資料夾
ls -al .output/server
可以得到 No such file or directory 沒有找到 Run pnpm install 建構的前端框架使用的套件檔案
默認堆內存限制太小:Node.js 默認的最大堆內存限制通常是 2GB 左右
但是在建構過程前端框架的套件應用有大量的依賴,因此會造成內存不足
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
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:
進入 Ubuntu 主機,檢查建構 Docker Build Image 的機器的記憶體空間
以此機器為例,最大值為 8G 可用為 4G ,因此超過 4G 是有可能造成其他異常,設定 4096 MB是最合適的。
※回顧:不設定預設為 2048 MB,目前預設會早成此錯誤發生
free -h
在 DockerFile 第 Step 8. 原本如下:
Run pnpm install
調整成以下:
Run NODE_OPTIONS=--max_old_space_size=4096 pnpm install
在原本的 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
無論選擇 解法1 or 解法2 最終都可以提高記憶體使用量,因此最終都能順利建構前端框架套件
建構完 Image 後,在進入容器內檢查,這次有正確產生套件,並且容器也可正常運行,排除 502 GeteWay 錯誤
ls -al .output/server