Docker部署至Elastic Beanstalk速度过慢问题求助
问题描述
我的应用功能一切正常,但每次执行eb deploy耗时都超过4分钟。这只是个包含React Hello World页面的简单应用,首次部署要安装Node及依赖,慢属于正常情况,但仅修改应用内容后重新部署,仍需花费4-5分钟。我试过使用eb deploy --staged命令,耗时依旧没有改善。
我的Dockerfile内容:
FROM node:16.16.0 as ui WORKDIR /app COPY ./ui/package.json . RUN npm install COPY ./ui/ . WORKDIR /admin COPY ./admin/package.json . RUN npm install COPY ./admin/ . FROM ui as ui1 WORKDIR /app RUN npm run build WORKDIR /admin RUN npm run build FROM nginx EXPOSE 3000 5001 COPY ./nginx/prod.conf /etc/nginx/conf.d/default.conf COPY --from=ui1 /app/build /usr/share/nginx/html COPY --from=ui1 /admin/build /usr/share/nginx/admin
我的docker-compose配置:
version: "3" services: backend: build: context: ./backend volumes: - /app/node_modules - ./backend:/app nginx: volumes: - ./nginx/prod.conf:/etc/nginx/conf.d/default.conf restart: always build: context: ./ ports: - "80:80"
优化部署耗时的方案
利用Docker构建缓存提升效率
当前Dockerfile中,COPY ./ui/ .放在RUN npm install之后,导致ui目录下任何文件改动都会触发重新执行npm install。调整文件复制顺序,先复制依赖配置文件,再安装依赖,最后复制项目代码,这样只有依赖配置变动时才会重新安装依赖:FROM node:16.16.0 as ui # 处理ui项目 WORKDIR /app COPY ./ui/package.json ./ui/package-lock.json* ./ RUN npm install COPY ./ui/ . # 处理admin项目 WORKDIR /admin COPY ./admin/package.json ./admin/package-lock.json* ./ RUN npm install COPY ./admin/ . FROM ui as ui1 WORKDIR /app RUN npm run build WORKDIR /admin RUN npm run build FROM nginx EXPOSE 3000 5001 COPY ./nginx/prod.conf /etc/nginx/conf.d/default.conf COPY --from=ui1 /app/build /usr/share/nginx/html COPY --from=ui1 /admin/build /usr/share/nginx/admin同时复制
package-lock.json,既能保证依赖安装的一致性,也能进一步提升缓存命中率。启用Elastic Beanstalk的Docker层缓存
EB默认会重新构建整个镜像,可通过配置开启Docker层缓存:- 在EB控制台进入应用环境的「软件」配置项,检查并启用Docker缓存选项;
- 或在
.elasticbeanstalk/config.yml中添加以下配置:deploy: docker: cache: true
拆分独立构建阶段
将ui和admin的构建拆分为独立阶段,这样改动其中一个项目时,另一个项目的构建缓存不会失效:# UI构建阶段 FROM node:16.16.0 as ui-build WORKDIR /app COPY ./ui/package.json ./ui/package-lock.json* ./ RUN npm install COPY ./ui/ . RUN npm run build # Admin构建阶段 FROM node:16.16.0 as admin-build WORKDIR /admin COPY ./admin/package.json ./admin/package-lock.json* ./ RUN npm install COPY ./admin/ . RUN npm run build # Nginx阶段 FROM nginx EXPOSE 3000 5001 COPY ./nginx/prod.conf /etc/nginx/conf.d/default.conf COPY --from=ui-build /app/build /usr/share/nginx/html COPY --from=admin-build /admin/build /usr/share/nginx/admin移除不必要的服务构建
如果部署时不需要构建backend服务(比如backend已单独部署),可将docker-compose中的backend服务注释或删除,减少EB的构建工作量。
内容的提问来源于stack exchange,提问作者Gracie williams
相关产品推荐
相关产品推荐

