在docker容器中构建react应用程序时JavaScript内存不足
我想将React/Flask应用程序部署到AWS EC2 t2.micro实例中。我得到了一个docker compose文件以及React和Flask的相应docker文件 Docker为Flask API创建并运行映像,但是,在构建React应用程序时,它会因内存不足而崩溃 我试着跑步: 运行节点--expose gc--max old space size=1024 node_modules/react scripts/scripts/build.js 从docker文件,但当我从docker compose构建它时,它永远不会完成npm运行构建并保持库存 我也尝试添加模块增加内存限制,但都没有完成 这是我的docker-compose.yml:在docker容器中构建react应用程序时JavaScript内存不足,javascript,reactjs,amazon-ec2,docker-compose,dockerfile,Javascript,Reactjs,Amazon Ec2,Docker Compose,Dockerfile,我想将React/Flask应用程序部署到AWS EC2 t2.micro实例中。我得到了一个docker compose文件以及React和Flask的相应docker文件 Docker为Flask API创建并运行映像,但是,在构建React应用程序时,它会因内存不足而崩溃 我试着跑步: 运行节点--expose gc--max old space size=1024 node_modules/react scripts/scripts/build.js 从docker文件,但当我从dock
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
我的React应用程序Dockerfile:
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;"]
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"]
还有我的烧瓶Dockerfile:
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;"]
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"]
问题的根本原因是VM t2.micro的弱点 t2.micro只有1个vCPU和1GB内存 我想说,这个容量足以满足应用程序运行时(nginx)的需要 但是对于应用程序构建(
npm运行构建
)来说,这永远都是不够的
根据经验,我们负责构建400多个计划,npm build
对于一些react/angular项目可以占用16G内存
变通办法
如果您不想花钱打开更大的VM(实例),这是一个解决方法:
- 在计算机中生成映像
- 将生成的映像复制到ec2实例
- 在ec2实例中运行映像
#构建它
docker构建-t前端:v1.0-f react.Dockerfile。
#将图像另存为简单文件
docker保存前端:v1.0 | gzip>frontend.tar.gz
#将文件复制到ec2机器上
scp frontend.tar.gz ec2-user@x.x.x.x:/tmp
在您的ec2实例中
#将简单文件加载到图像中
码头装卸工负载
情不自禁!祝你好运非常感谢。我想从我的电脑上运行npm运行build,然后将静态文件复制到Dockerfile中,但你的解决方案要好得多。再次感谢你!!欢迎@BrianNieto!