我使用 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
的建议,但构建仍然失败,尽管这次错误不同:
在使用
max_old_space_size
之前,构建通常在 Browserslist: caniuse-lite is outdated. Please run next command npm update
之后就已经失败,但在这里,它成功地克服了这一点。
可以为一台机器上的所有 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。 运行有角度的生产构建。