如何使用Docker提高Angular 5项目的构建时间?

如何使用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

我正在努力提高自动化的构建时间。目前,仅构建前端就需要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 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
    ),并根据故障率进行标记
  • 创建一个新的映像,其内容刚好足以运行构建的文件
[长版]

您的npm依赖项很有可能会被重新下载,并且/或者您运行的每个构建都会重新生成docker映像

与其将文件复制到docker映像中,不如为模块和缓存装载卷,这样以后包含的其他依赖项就不需要再次下载。您应该考虑创建卷的典型目录是NPMIX模块(一个是全局的,一个是本地的)和NPM(Cache)。 您的
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)---->|