使用npm global install angular-cli

时间:2016-10-04 03:53:16

标签: node.js docker angular-cli alpine

我遇到了一个非常奇怪的情况,并且想知道是否有人能够对这种情况有所了解。简而言之,docker build npm install -g angular-cli@1.0.0-beta.16以及其他应用程序步骤需要永远构建。 docker build单独使用其自己的图片,然后docker build第一张图片的FROM应用FROM alpine:3.4的其他部分,无论是一起还是单独拍摄都不会花费那么久。当我说多久,我的意思是2个小时。这些人需要大约5到7分钟的时间来建造。

所以在我放下所有代码之前,请注意几点。我在OS X 10.10.5,OS X 10.11.X,OS X 10.12.X,Arch Linux 4.5.1-1-ARCH,Ubuntu 14.04 LTS(在流浪盒中,在AWS中)尝试了这个,以及有些朋友在他们的机器上帮助我。所有相同的结果。我正在运行Docker 1.12.1。我正在建造nodev6.2.0的版本为npmFROM alpine:3.4 MAINTAINER First Lastname <user@example.com> ARG ENV #Set environment vars ENV HOME=/home \ APP_DIR=/root/app \ DIST_DIR=/var/www \ ENV=${ENV} \ AWS_REGION=us-east-1 \ NPM_CONFIG_LOGLEVEL=info \ LANG=en_US.UTF-8 \ LC_ALL=C.UTF-8 \ LANGUAGE=en_US.UTF-8 #Install runtime packages RUN apk --no-cache add \ ca-certificates \ nodejs \ nginx #Install build time packages RUN apk --no-cache add \ --virtual build-dependencies \ busybox \ build-base \ bzip2 \ git \ python-dev \ libffi-dev RUN mkdir -p ${APP_DIR} WORKDIR ${APP_DIR} COPY . ${APP_DIR} #Bug https://github.com/npm/npm/issues/9863 RUN cd $(npm root -g)/npm && \ npm install fs-extra && \ sed -i -e s/graceful-fs/fs-extra/ -e s/fs\.rename/fs.move/ ./lib/utils/rename.js && \ rm -fr ${APP_DIR}/node_modules #install node packages RUN npm install -g angular-cli@1.0.0-beta.16 && \ npm install -g typescript@2.0.3 && \ npm install && npm install -g --save process-nextick-args && npm cache clean | tee /tmp/npm-install.log #build project RUN ng build --environment=${ENV} RUN mv dist ${DIST_DIR} #clean up RUN rm -fr ${APP_DIR} RUN apk del build-dependencies #nginx config COPY ./nginx/nginx.conf /etc/nginx/ RUN mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled/ && \ chmod -R 755 /etc/nginx/sites-* RUN ln -sf /dev/stdout /var/log/nginx/access.log && \ ln -sf /dev/stderr /var/log/nginx/error.log COPY ./nginx/account-curation.conf /etc/nginx/sites-available/ RUN ln -s /etc/nginx/sites-available/account-curation.conf /etc/nginx/sites-enabled/ #app port EXPOSE 80 81 #start nginx ENTRYPOINT [ "nginx" ] 3.8.9(来自alpine软件包)。我还尝试了一个图像,我从源代码构建了nodejs v5.11.1和npm 3.

{
  "name": "app-name",
  "version": "0.0.0",
  "license": "MIT",
  "angular-cli": {},
  "scripts": {
    "start": "ng serve",
    "lint": "tslint \"src/**/*.ts\"",
    "test": "ng test",
    "pree2e": "webdriver-manager update",
    "e2e": "protractor"
  },
  "private": true,
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular2-material/button": "2.0.0-alpha.8-2",
    "@angular2-material/card": "2.0.0-alpha.8-2",
    "@angular2-material/checkbox": "2.0.0-alpha.8-2",
    "@angular2-material/core": "2.0.0-alpha.8-2",
    "@angular2-material/grid-list": "2.0.0-alpha.8-2",
    "@angular2-material/icon": "2.0.0-alpha.8-2",
    "@angular2-material/input": "2.0.0-alpha.8-2",
    "@angular2-material/input": "2.0.0-alpha.8-2",
    "@angular2-material/list": "2.0.0-alpha.8-2",
    "@angular2-material/progress-circle": "2.0.0-alpha.8-2",
    "@angular2-material/tabs": "2.0.0-alpha.8-2",
    "@angular2-material/toolbar": "2.0.0-alpha.8-2",
    "angular2-modal": "2.0.0-beta.13",
    "core-js": "2.4.1",
    "es6-shim": "0.35.1",
    "hammerjs": "2.0.8",
    "jquery": "3.1.0",
    "jstree": "3.3.1",
    "localStorage": "1.0.3",
    "rxjs": "5.0.0-beta.12",
    "ts-helpers": "1.1.1",
    "zone.js": "0.6.25"
  },
  "devDependencies": {
    "@types/hammerjs": "^2.0.33",
    "@types/jasmine": "^2.2.30",
    "@types/jquery": "^2.0.32",
    "@types/jstree": "^3.3.32",
    "angular-cli": "1.0.0-beta.16",
    "codelyzer": "0.0.26",
    "jasmine-core": "2.4.1",
    "jasmine-spec-reporter": "2.5.0",
    "karma": "1.2.0",
    "karma-chrome-launcher": "2.0.0",
    "karma-cli": "1.0.1",
    "karma-jasmine": "1.0.2",
    "karma-remap-istanbul": "0.2.1",
    "protractor": "4.0.9",
    "ts-node": "1.2.1",
    "tslint": "3.13.0",
    "typescript": "2.0.3"
  }
}

package.json看起来像

FROM

我指出这一点是因为它已经拥有了我尝试全局安装的所有软件包(相同版本),但是当它安装它时要快得多。所以这需要大约2个小时来构建。疯了吧?因此,经过几天的愚弄,我无法弄清楚原因。我根据时间决定使用全局安装构建基本映像,然后构建项目映像FROM alpine:3.4 MAINTAINER First Lastname <user@example.com> #Set environment vars ENV NPM_CONFIG_LOGLEVEL=info \ LANG=en_US.UTF-8 \ LC_ALL=C.UTF-8 \ LANGUAGE=en_US.UTF-8 #Install runtime packages RUN apk --no-cache add \ ca-certificates \ nodejs #Install build time packages RUN apk --no-cache add \ --virtual build-dependencies \ busybox \ build-base \ bzip2 \ git \ python-dev \ libffi-dev #Bug https://github.com/npm/npm/issues/9863 RUN cd $(npm root -g)/npm && \ npm install fs-extra && \ sed -i -e s/graceful-fs/fs-extra/ -e s/fs\.rename/fs.move/ ./lib/utils/rename.js #install node packages RUN npm install -g angular-cli@1.0.0-beta.16 && \ npm install -g typescript@2.0.3 && \ npm install -g --save process-nextick-args && npm cache clean | tee /tmp/npm-global-install.log RUN apk del build-dependencies ENTRYPOINT [ "/bin/ash" ] 。这样,CI构建作业在每次推送到此存储库分支时都不会花费数小时。但是当我这样做时,它神奇地变得更快了。基本图像大约7分钟,应用程序图像大约5分钟。它看起来像这样。

基本图片:

FROM company/application_base:latest
MAINTAINER First Lastname <user@example.com>

ARG ENV

#Set environment vars
ENV APP_DIR=/root/app \
    DIST_DIR=/var/www \
    ENV=${ENV} \
    AWS_REGION=us-east-1 \
    NPM_CONFIG_LOGLEVEL=info \
    LANG=en_US.UTF-8 \
    LC_ALL=C.UTF-8 \
    LANGUAGE=en_US.UTF-8

#Install runtime packages
RUN apk --no-cache add \
          ca-certificates \
          nginx

#Install build time packages
RUN apk --no-cache add \
        --virtual build-dependencies \
          busybox \
          build-base \
          bzip2 \
          git \
          python-dev \
          libffi-dev

RUN mkdir -p ${APP_DIR}
COPY . ${APP_DIR}
WORKDIR ${APP_DIR}

#install node packages
RUN npm install && npm cache clean | tee /tmp/npm-install.log

#build project
RUN ng build && mv dist ${DIST_DIR}

#clean up
RUN rm -fr ${APP_DIR} && apk del build-dependencies

#nginx config
COPY ./nginx/nginx.conf /etc/nginx/
RUN mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled/ && \
    chmod -R 755 /etc/nginx/sites-* && \
    ln -sf /dev/stdout /var/log/nginx/access.log && \
    ln -sf /dev/stderr /var/log/nginx/error.log
COPY ./nginx/account-curation.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/account-curation.conf /etc/nginx/sites-enabled/

#app port
EXPOSE 80 81

#start nginx
ENTRYPOINT [ "nginx" ]

应用图片

nodejs

我不知道angular-cli那么我试图避免安装npm install两次,package.json然后mv /path/to/app/node_modules/.bin/ng/usr/bin/path/to/app/node_modules/.bin也只是将ng not found添加到我的路径中,两者都产生了gyp WARN EACCES user "nobody" does not have permission to access the dev dir

不确定它是否相关,但我会将其称为任何人,我一直只为全局安装的软件包获取这个恼人的npm gyp权限问题。 docker build --build-arg ENV=dev --cpuset-cpus "0-5" --no-cache -t company/app_name:0.1.0 .他们只是警告,但我想我会谷歌,看看它是什么。只是为了排除可能性,我尝试了一些方法来修复https://docs.npmjs.com/getting-started/fixing-npm-permissions这样的帖子 和 https://github.com/nodejs/node-gyp/issues/454 我找不到任何工作。

我尝试过的其他事情正在搞乱码头可以利用的ram和cpu的数量。例如Dockerfile

我真的不想保留两个{{1}},特别是当我觉得有些东西真的很笨我错过了。因为我知道他们在分开时工作得更好。什么在它可能会导致这种情况下如此多地增加构建时间。

2 个答案:

答案 0 :(得分:1)

&#34; all&#34;由于execSyncnode-zopfli构建其原生模块的问题非常缓慢,因此图像构建需要很长时间。两者都是可选的依赖项,因此安装使它们无法正常工作,但它们需要花费很长时间才能失败。

分割的图像构建使这两个软件包无法快速构建。我真的不确定这是怎么发生的,因为似乎有很多变化可能导致他们无法快速建立。

execAsync

execSync模块不再存在,它对于节点0.10也是如此。 如果我从npm中删除Dockerfile错误修复程序,则execAsync构建会立即失败,而不是花费很长时间才能失败。

节点zopfli

要删除权限问题,请使用npm install --unsafe-perm以允许构建作为容器中的root用户运行。

devDependencies

使用devDependencies或[{1}}版本的全局安装,而不是两者。 ng将从应用安装中删除npm install --production,这意味着devDependencies不再重复。如果您需要更多的devDependencies来完成应用程序构建,那么您可能希望采用其他方式,而不是进行全局安装,而只依赖于devDepenencies(angular-cli

其他注释

使用./node_modules/.bin/ng获取最新版本的node / npm,并且不要通过FROM mhart/alpine-node:6安装nodejs

尽可能晚地设置apkARG ENV(即在使用它的ENV ENV命令之前),以便环境更改不会触发完全重建图像。

ng之后的Dockerfile命令中运行清理步骤时,没有图像大小可以获得(或真正丢失)。此时文件已提交到上一个图像层。

在进行重复的docker镜像构建时,对于npm使用verdacio / npm-register和/或apt-cacher-ng使用通用os包。它们将消除重复的docker构建的大部分网络开销。

Dockerfile

所以你最终得到这样的东西:

RUN apk del build-dependencies

拥有两个Dockerfiles也没问题。因为每个人都应该做自己的事情而不是重复其他人的行动。当您从一个基本图像构建多个图像时,通常只需要需要来执行此操作。

答案 1 :(得分:0)

值得指出可能相关的是在npm安装步骤之前添加它:

RUN npm config set maxsockets 10 

在旧版本的npm上它是无限的,在较新版本的它是50。 当我明确地将它设置为10时,我得到了极大的速度提升(依稀记得有人说25对他有​​好处)。