Node.js 使用npm global install cli的Docker构建时间很长

Node.js 使用npm global install cli的Docker构建时间很长,node.js,docker,angular-cli,alpine,Node.js,Docker,Angular Cli,Alpine,我遇到了一个非常奇怪的情况,我想知道是否有人能够透露一些情况。简而言之,docker buildwithnpm install-g-cli@1.0.0-beta.16以及其余的应用程序步骤需要永远的构建docker build在它自己的图像中单独使用它,然后docker build应用程序的其余部分从第一个图像开始,一起或单独使用它们不会花费那么长的时间。当我说长的时候,我的意思是2个小时。这些个体大约需要5到7分钟来构建 所以在我写下所有的代码之前,先做一些注释。我在OS X 10.10.5、

我遇到了一个非常奇怪的情况,我想知道是否有人能够透露一些情况。简而言之,
docker build
with
npm install-g-cli@1.0.0-beta.16
以及其余的应用程序步骤需要永远的构建
docker build
在它自己的图像中单独使用它,然后
docker build
应用程序的其余部分
从第一个图像开始,一起或单独使用它们不会花费那么长的时间。当我说长的时候,我的意思是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、Ubuntu14.04 LTS(在一个流浪者盒子和AWS中)上试过这个,还有一些朋友在他们的机器上帮过我。结果都一样。我正在运行Docker 1.12.1。我正在从alpine:3.4构建
node
的版本是
v6.2.0
npm
3.8.9(来自alpine软件包)。我还尝试了使用我从源代码构建的NodeJSV5.11.1和NPM3的映像

FROM 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" ]
我指出这一点是因为它已经有了我试图在全球范围内安装的所有软件包(同一版本),但是当它安装时,它会更快。所以这需要大约2个小时来构建。疯狂吧?所以在玩了几天之后,我不明白为什么。考虑到时间,我决定构建一个包含全局安装的基本映像,然后从该映像构建项目映像。这样,CI构建作业就不会每次推送到此存储库分支时都花费数小时。但当我这么做的时候,它神奇地变快了。基本图像约7分钟,应用程序图像约5分钟。它看起来像这样

基本图像:

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" ]
来自阿尔卑斯山的
:3.4
维护者姓氏
#设置环境变量
环境NPM_配置_日志级别=信息\
LANG=en_US.UTF-8\
LC_ALL=C.UTF-8\
语言=en_US.UTF-8
#安装运行时软件包
运行apk--无缓存添加\
ca证书\
nodejs
#安装构建时软件包
运行apk--无缓存添加\
--虚拟生成依赖项\
汇流箱\
建基\
bzip2\
吉特\
python开发人员\
利伯菲开发公司
#臭虫https://github.com/npm/npm/issues/9863
运行cd$(npm root-g)/npm&&\
npm安装fs extra&&\
sed-i-es/fs/fs extra/-es/fs\.rename/fs.move//lib/utils/rename.js
#安装节点包
运行npm安装-g-cli@1.0.0-beta.16和&\
npm安装-gtypescript@2.0.3 && \
npm install-g--保存进程nextick args和npm cache clean | tee/tmp/npm-global-install.log
运行apk del生成依赖项
入口点[“/bin/ash”]
应用程序映像

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" ]
来自公司/应用程序库:最新
维护者姓氏
精氨酸环境
#设置环境变量
环境应用程序目录=/root/APP\
DIST_DIR=/var/www\
ENV=${ENV}\
AWS_地区=美国东部-1\
NPM_配置_日志级别=信息\
LANG=en_US.UTF-8\
LC_ALL=C.UTF-8\
语言=en_US.UTF-8
#安装运行时软件包
运行apk--无缓存添加\
ca证书\
nginx
#安装构建时软件包
运行apk--无缓存添加\
--虚拟生成依赖项\
汇流箱\
建基\
bzip2\
吉特\
python开发人员\
利伯菲开发公司
运行mkdir-p${APP_DIR}
抄袭${APP_DIR}
WORKDIR${APP_DIR}
#安装节点包
运行npm安装和npm缓存清理| tee/tmp/npm-install.log
#建设项目
运行ng build&mv dist${dist_DIR}
#清理
运行rm-fr${APP_DIR}&&apk del build dependencies
#nginx配置
复制./nginx/nginx.conf/etc/nginx/
运行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
副本./nginx/account-curation.conf/etc/nginx/sites可用/
运行ln-s/etc/nginx/sites available/account-curation.conf/etc/nginx/sites enabled/
#应用程序端口
曝光80 81
#启动nginx
入口点[“nginx”]
我不太了解
nodejs
,所以我两次试图避免安装
angular cli
,是
npm安装
来自
包的那一个。json
然后
mv
它从
/path/to/app/node\u modules/.bin/ng
/usr/bin
也只是将
/path/to/app/node\u modules/.bin
添加到我的路径,两者都导致了
ng未找到

不确定它是否相关,但我会称之为任何人,我一直收到这个恼人的npm gyp权限问题,只适用于全球安装的软件包
gyp WARN EACCES用户“nobody”没有访问dev dir的权限
他们只是警告,但我想我会用谷歌搜索一下,看看是怎么回事。为了排除这种可能性,我尝试了一些建议的方法来解决这个问题,比如 及 我找不到任何有用的东西

我尝试过的另一件事是干扰docker可以利用的ram和cpu的数量。例如
docker build--build arg ENV=dev--cpuset cpu“0-5”--无缓存-t company/app\u name:0.1.0.

我真的不想维护两个
Dockerfile
,尤其是当我觉得我缺少了一些非常愚蠢的东西时。因为我知道他们分开的时候效果更好。究竟是什么原因导致这一切在一起时会使构建时间增加这么多。

由于
execSync
node zopfli
构建其本机模块的速度非常慢,因此“全部”映像构建需要很长时间。这两个都是可选的依赖项,因此安装可以在它们不工作的情况下生存下来,但它们需要很长时间才能失败

分割的映像构建使得这两个包都无法快速构建。我真的不知道这是怎么发生的,因为似乎有很多变化可能会导致他们失败
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" ]
FROM mhart/alpine-node:6.7
MAINTAINER First Lastname <user@example.com>

# Set environment vars
ENV HOME=/root \
    APP_DIR=/root/app \
    DIST_DIR=/var/www \
    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 packages
RUN apk --no-cache add \
        --virtual build-dependencies \
        ca-certificates \
        nginx \
        build-base \
        bzip2 \
        git \
        python-dev \
        libffi-dev

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

# Install node packages
RUN set -uex ;\
    npm install -g angular-cli@1.0.0-beta.16 typescript@2.0.3 process-nextick-args ;\
    npm install --production --unsafe-perm ;\
    npm cache clean

ARG ENV
ENV ENV=${ENV}

# Build project
RUN set -uex ;\
    ng build  --environment=${ENV} ;\
    mv dist ${DIST_DIR} ;\
    rm -fr ${APP_DIR}

# nginx config
COPY ./nginx/nginx.conf /etc/nginx/
RUN set -uex ;\
    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" ]
RUN npm config set maxsockets 10