如何使用Docker提高Angular 5项目的构建时间?
我正在努力提高自动化的构建时间。目前,仅构建前端就需要14分钟如何使用Docker提高Angular 5项目的构建时间?,docker,nginx,angular-cli,dockerfile,angular5,Docker,Nginx,Angular Cli,Dockerfile,Angular5,我正在努力提高自动化的构建时间。目前,仅构建前端就需要14分钟 这就是我目前得到的 web.dockerfile ### STAGE 1: Build ### FROM node:9.3.0-alpine as builder COPY package.json ./ RUN npm set progress=false && npm config set depth 0 && npm cache clean --force ## Storing nod
这就是我目前得到的 web.dockerfile
### STAGE 1: Build ###
FROM node:9.3.0-alpine as builder
COPY package.json ./
RUN npm set progress=false && npm config set depth 0 && npm cache clean --force
## Storing node modules on a separate layer will prevent unnecessary npm installs at each build
RUN npm i
RUN mkdir /web
RUN cp -R ./node_modules ./web
WORKDIR /web
COPY . .
RUN $(npm bin)/ng build --prod --build-optimizer
### STAGE 2: Setup ###
FROM nginx:1.13.8-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY site.conf /etc/nginx/conf.d/default.conf
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /web/dist /usr/share/nginx/html/
RUN touch /var/run/nginx.pid && \
chown -R nginx:nginx /var/run/nginx.pid && \
chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /usr/share/nginx/html
USER nginx
运行$(npm-bin)/ng build--prod--build优化器
上面这行代码花费了很长时间,几乎占了整个构建时间的99%
.angular-cli.json 环境 DockerCloud连接到我的AWS 自动气象站:EC2微型
结果 这个dockerfile工作得很好,并且取得了成功
但建造大约需要14分钟。有没有可能改善这一点?是因为我的实例处理器太少吗?[TL;DR]
- 使用卷存储节点_模块和.npm
- 并行化部分流程(例如测试)
- 使用相对路径时要小心
- 不要使用
copy..复制整个项目代码>。相对路径问题和可能的信息泄漏
- 创建一个单独的映像,其中仅包含用于构建和测试的核心依赖项(例如npm、java、chrome驱动程序、libgconf2)
- 配置管道以使用此映像
- 让CI克隆repo并将您的项目复制到容器中以进行构建和测试
- 归档生成的文件(例如,
),并根据故障率进行标记dist
- 创建一个新的映像,其内容刚好足以运行构建的文件
package.json
正在被复制到root/
中,相同的package.json
正在被复制到/web
中,并使用COPY代码>
最初运行的npm i
正在安装到/
中,您正在为/web
再次运行它。您下载了两次依赖项,但是/
中的模块将用于任何用途吗?不管怎样,您似乎在npmi
和ng build
中使用了相同的package.json,因此同样的事情被做了两次,([EDIT]-似乎ng build
没有重新下载包)但是node_模块在/
中不可用,因此npm i
命令创建另一个模块并重新下载所有包
您可以在root/
中创建一个web
目录,但还有其他命令指示相对路径/web
。你确定事情进展顺利吗?如果您使用相对路径,则无法保证程序会在您希望的目录中查找。虽然它似乎适用于此映像,但对于具有不同初始工作目录的其他映像,相同的做法将不一致
[可能是也可能不是相关信息]
虽然我没有使用Bitbucket来自动化构建,但在运行Jenkins管道时,我遇到了类似的问题。Jenkins将项目放在不同的目录中,这样每次运行时,所有依赖项都会再次下载。我最初以为项目会在/home/agent/project
中,但实际上它被放在了其他地方。我在构建步骤中使用pwd
和npm cache verify
命令找到了项目复制到的目录,然后将卷装载到正确的位置。您可以在生成的日志中查看输出
您可以通过展开管道页面中的部分来查看输出
如果每次运行时都要重建映像,请分别构建映像,然后将映像推送到注册表。将管道文件配置为使用您的映像。您应该尽可能使用已经可用的基本映像,除非在基本映像中有其他不可用的依赖项(例如alpine的apk包,而不是npm。npm依赖项可以存储在卷中)。如果要使用公共注册表,请不要存储任何可能包含敏感数据的文件。配置管道,以便装载卷和/或使用机密
测试和构建步骤的基本重组
Image on Docker Hub
|
|
---|-------------------------------------|
| | |
V V |
Commit -- build (no test) ---> e2e tests (no build)-]--+--> archive build --> (deploy/merge/etc)
| _______________| ^
| v |
|-> unit tests (no build)---->|
您不需要完全遵循它,但它应该能让您了解如何使用并行步骤来分离事物并缩短完成时间。本地构建需要多长时间?本地构建大约需要2分钟,仅构建我的web。构建服务器cpu/内存是否受限?也许本地您可以通过它供电,但是构建服务器一次执行10个构建,并且没有额外的cpu/内存来更快地执行。我的构建服务器只执行此自动构建。您可以发布您正在使用的操作系统的详细信息吗,docker版本?此外,构建日志也会有所帮助非常感谢您的回答,以及在执行复制时有关敏感信息安全性的建议代码>我应该使用什么来代替?你能建议一个更好的Dockerfile我的应该是什么样子吗?我真的不明白,或者不知道当你说,使用卷来存储节点模块和.npm
或者并行化部分过程(例如测试)时是怎么说的
您可以显示代码片段、链接或对这些要点的解释吗?您可以使用COPY代码>如果您知道要复制的内容。有些人可能会将密码/证书/密钥保留在同一个项目目录中,而您不希望这些密码/证书/密钥被复制,然后被推送到
Image on Docker Hub
|
|
---|-------------------------------------|
| | |
V V |
Commit -- build (no test) ---> e2e tests (no build)-]--+--> archive build --> (deploy/merge/etc)
| _______________| ^
| v |
|-> unit tests (no build)---->|