Docker 和 Node:致命错误:达到堆限制分配失败 - JavaScript 堆内存不足

cph*_*ill 7 heap-memory node.js docker google-cloud-run

我有一个节点 NextJS 应用程序,我正在使用 Docker 对其进行容器化,然后部署到 GCP Cloud Run。虽然 Docker 在本地运行没有问题,但在部署到 Cloud Run 时会遇到错误。当我查看错误日志时,它似乎经历了各种步骤,例如安装软件包和运行迁移,没有出现问题,但随后意外失败并显示错误消息:

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory 
Uncaught signal: 6, pid=13, tid=13, fault_addr=0.
Uncaught signal: 6, pid=1, tid=1, fault_addr=0.
Container terminated on signal 6.
Run Code Online (Sandbox Code Playgroud)

我发现使用如此简单的应用程序遇到这种情况有点奇怪,我想知道这意味着什么以及防止这种情况发生的选项(更小的docker大小?)或解决(扩展节点内存?)

不确定需要哪些附加信息,但可能相关的是

Package.json(脚本):

"scripts": {
    "dev": "nodemon server.js",
    "build": "next build",
    "start": "NODE_ENV=production npm run db:migrate && node server.js",
    "test": "jest --watch",
    "test:ci": "jest --ci",
    "db:migrate": "node_modules/.bin/sequelize db:migrate",
    "db:migrate:undo": "node_modules/.bin/sequelize db:migrate:undo",
    "db:migrate:undo:all": "node_modules/.bin/sequelize db:migrate:undo:all",
    "db:seed": "node_modules/.bin/sequelize db:seed:all",
    "db:seed:undo:all": "node_modules/.bin/sequelize db:seed:undo:all"
  },
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

version: "3.9"
services:
    redis:
        image: redis:alpine
    database:
        image: postgres
        ports:
            - "5432:5432"
        environment: 
            POSTGRES_USER: 'postgres'
            POSTGRES_PASSWORD: ''
            POSTGRES_DB: ${DB_DATABASE}
        volumes:
            - nextjs_auth_boilerplate:/var/lib/postgresql/data/ # persist data even if container shuts down
    app:
        image: nextjs-auth-boilerplate
        build: .
        depends_on:
            - redis
            - database
        command: ["./wait-for-it.sh", "database:5432", "--", "npm", "start"]
        ports:
            - "3000:3000"
        environment: 
            - REDIS_HOST=redis
            - DB_HOSTNAME=database
volumes:
    nextjs_auth_boilerplate:
Run Code Online (Sandbox Code Playgroud)

jac*_*dbd 0

如果不知道用于将代码部署到 Cloud Run 的命令,则很难判断出了什么问题,但您发布的文件不是Dockerfile. 这是一个 docker compose 文件,您无法在 Google Cloud Run 中使用 docker-compose.yml。这意味着您的 Cloud Run 服务既没有 Redis,也没有 PostgreSQL。

我的大胆猜测是,您部署了 NextJS 应用程序,然后db:migrateSequelize CLI 的命令找不到数据库并最终发出SIGABRT(信号 6)。

您可以尝试node server.js使用更大的 V8 内存堆执行(请参阅 Node.js 堆内存不足),但我怀疑这是否能解决您的问题。

可能相关: