用于生产的 Angular 构建消耗太多内存?

问题描述 投票:0回答:1

我使用 Docker 打包了 Node.js/Angular 应用程序,并设置了一个 GitLab Runner 进行一键部署,以将更改部署到实时服务器。

docker-compose.yml

version: "3"
services:
    client:
        build: 
           context: ...
           dockerfile: ...
           ...
    server:
        build:
           context: ...
           dockerfile: ...
           ...

问题是,当构建到达

Dockerfile
中的这部分时:

ng build --prod

它总是失败,并且我在服务器上出现内存不足错误(1GB RAM)。

"build-prod": "ng build --prod --aot=true --buildOptimizer=true",

除了在本地计算机上构建文件并将它们提交到存储库,然后复制/粘贴这些文件之外,还有解决方法吗?

Dockerfile
对于
client

# STAGE 1 - Build app

FROM node:12-alpine as client

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build-prod

#STAGE 2: Run NGINX

FROM nginx

COPY --from=client /app/dist/* /var/www/html

COPY default.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

更新:

我尝试了使用

max_old_space_size
的建议,但构建仍然失败,尽管这次错误不同:

enter image description here

在使用

max_old_space_size
之前,构建通常在
Browserslist: caniuse-lite is outdated. Please run next command npm update
之后就已经失败,但在这里,它成功地克服了这一点。

angular docker gitlab gitlab-ci-runner
1个回答
0
投票

可以为一台机器上的所有 NodeJS 进程设置内存限制,这意味着在一台开发人员机器上构建的内容可能无法在另一台机器上构建,因为他们可能已经提高/降低了内存限制。 与上述类似,某些托管构建代理(例如 Azure Devops、Github Actions 等)的内存限制设置可能比您想象的更低/更高,这意味着构建在此处成功/失败,而在其他计算机上则不然。 角度项目的非生产构建(例如仅使用 ngserve)构建良好,但使用生产标志构建会消耗更多内存,因此仅在生产中构建时可能会崩溃。 幸运的是,有一个非常简单的解决方案可以解决上述所有问题。虽然您可以在自述文件中留下注释“嘿,您需要将内存增加到 XYZ”,但更好的选择是创建一个 npm 构建脚本,仅设置该构建的内存限制,而将其他所有内容保留在计算机上照原样。

例如,我最近的一个项目在 package.json 中有这些脚本集:

"scripts": {
  "ng": "ng",
  "start": "ng serve",
  "build": "ng build",
  "test": "ng test",
  "lint": "ng lint",
  "e2e": "ng e2e",
  "build-prod": "node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng build --prod",
}

注意最后一个脚本。看起来很复杂,其实很简单。

启动Node进程。 将“最大旧空间大小”设置为 8000MB。 在节点模块文件夹中找到 Angular CLI。 运行有角度的生产构建。

© www.soinside.com 2019 - 2024. All rights reserved.