Очень медленная сборка ng -prod в Docker

#node.js #angular #docker #angular-cli-v6

#node.js #угловой #docker #angular-cli-v6

Вопрос:

Когда я пытаюсь создать проект angular7 внутри docker, это занимает около 40 минут. Строка, которая занимает 40 минут,

ng build —prod

92% оптимизация ресурсов TerserPlugin

Я запустил ng build —prod вне docker на том же ноутбуке, это занимает 2 минуты.

Я пытался добавить —build-optimizer false

и —sourceMap=false

Не имеет никакого значения

Вот мой файл Dockerfile

 FROM node:carbon
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
RUN npm install -g @angular/cli@6.1.0
COPY . .
RUN ng build --prod
EXPOSE 4200
CMD [ "npm", "start" ]
HEALTHCHECK --interval=5s --timeout=30s --retries=20 CMD curl --fail http://localhost:4200 || exit 1
 

Комментарии:

1. около 2-3 минут

2. Почему бы вам не создать свое приложение angular перед запуском docker build>

3. У вас есть журналы docker?

4. @wentjun Выполнение сборки на хост-компьютере, а затем копирование содержимого, вероятно, не очень хорошая идея.

5. Я в замешательстве… почему используется angular 6.1.0 cli? Я думаю, что проблемы с сборкой были устранены в более новой версии cli 6795

Ответ №1:

Эта проблема с чрезвычайно медленными сборками почти всегда связана с нехваткой памяти в процессе сборки.

Узел не будет выделять много памяти для одного процесса (512 МБ в 32-битных системах и 1 ГБ в 64-битных системах), но при работе ng build с производственными настройками используется много памяти.

Вы можете использовать параметр узла, max_old_space_size чтобы установить, сколько оперативной памяти вы разрешаете использовать процессу, но вы должны передать параметр непосредственно в узел, поэтому замените

 ng build --prod
 

с

 node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod
 

для этого процесса будет выделено до 8 ГБ оперативной памяти, что значительно ускорит его выполнение.

Вы также можете добавить это в свои скрипты в package.json:

 "scripts": {
  ....
  "build:prod": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --prod"
 }
 

(Если увеличение лимита памяти не работает, попробуйте запустить ng build --prod --verbose , чтобы увидеть точные тайминги для разных этапов компиляции)

Комментарии:

1. вот хорошая статья (не зависящая от angular, только о nodejs) developer.ibm.com/articles /…

2. И если вы используете Mac, не забудьте также увеличить лимит памяти Docker.

3. не работает с docker: (

Ответ №2:

Как упоминал Даниэль в ответе, вы можете использовать параметр node --max_old_space_size , но я предпочитаю настраивать его через environment var:

 NODE_OPTIONS=--max-old-space-size=4096
 

Комментарии:

1. не работает с docker: (

2. @JRichardsz передайте его узлу таким образом в вашем пакете.json: «start»: «export NODE_OPTIONS= «—openssl-legacy-provider —max-old-space-size = 8192 «; ng serve —host 0.0.0.0»

3. Спасибо @grantwparks, я попробую!