JavaScript нехватка памяти при сборке приложения реакции в контейнере docker - PullRequest
0 голосов
/ 11 июля 2020

Я хочу развернуть приложение React / Flask в экземпляре AWS EC2 t2.micro . У меня есть файл docker -compose и соответствующий файл Dockerfile для React, а Flask.

Docker создает и запускает образ для Flask API, но при создании приложения React он cra sh с Javascript кучей вне памяти .

Я пробовал запустить:

RUN node --expose-g c - -max-old-space-size = 1024 node_modules / response-scripts / scripts / build. js

из Dockerfile, но когда я собираю его из docker -compose it never Fini sh the npm запустить сборку и оставить запас.

Я попытался добавить модуль limit-memory-limit тоже, но не закончил sh либо.

Вот мой docker -compose.yml:

version: '3.5'
services:
        frontend:
                container_name: frontend
                build:
                        context: ./frontend
                        dockerfile: Dockerfile
                ports:
                        - 80:80
                        - 443:443
                env_file: 
                        - ./frontend/.env
                environment: 
                        - REACT_APP_FLASK_API= "api address"
        api:
                restart: always
                container_name: api
                build:
                        context: ./api
                        dockerfile: Dockerfile
                expose:
                        - 5000
                environment:
                        - FLASK_ENV=development
                        - FLASK_APP=app.py
                        - FLASK_DEBUG=1

Dockerfile моего приложения React:

FROM node:latest as build
RUN mkdir -p /usr/src/app

# copy the react app to the container
WORKDIR /usr/src/app
COPY . /usr/src/app
COPY package.json /usr/src/app

# adding env variable
ARG REACT_APP_FLASK_API
ENV REACT_APP_FLASK_API "api address"

# prepare the container for building react
RUN npm install
RUN npm run build #node --expose-gc --max-old-space-size=1024 node_modules/react-scripts/scripts/build.js

# preprare nginx
FROM nginx:alpine
COPY --from=build /usr/src/app/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
# fire up nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

И мой Flask Dockerfile :

FROM python:3.6.10

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app
RUN pip install -r requirements.txt

COPY app.py /usr/src/app
COPY Complements /usr/src/app/Complements

ENTRYPOINT [ "flask" ]
CMD ["run", "--host=0.0.0.0", "--port=5000"]

1 Ответ

1 голос
/ 12 июля 2020

Причиной root проблемы является слабость виртуальной машины t2.micro.

t2.micro имеет только 1 виртуальный ЦП и 1 ГБ памяти

I сказал бы, что этой емкости может хватить для приложения (nginx).

Но этого никогда не будет достаточно для сборки приложения (npm run build

По нашему опыту, мы отвечаем за создание более 400 планов, а npm build может занимать до 16Г памяти для некоторых react / angular проектов .

Обходной путь

Если вы не хотите тратить деньги на открытие более крупной ВМ (экземпляра), это обходной путь:

  • Создайте образ (и) на вашем компьютере.
  • Скопируйте созданные образы в экземпляр ec2.
  • Запустите образы в экземпляре ec2.

на вашем ноутбуке

# build it
docker build -t frontend:v1.0 -f react.Dockerfile .

# save the image as simple file
docker save frontend:v1.0 | gzip > frontend.tar.gz

# copy the file to your ec2 machine

scp frontend.tar.gz ec2-user@x.x.x.x:/tmp

в вашем экземпляре ec2

# load the simple file into an image
docker load < /tmp/frontend.tar.gz

# validate that the image is loaded
docker images

не могу больше помочь! Удачи

...