我遇到了一个非常奇怪的情况,并且想知道是否有人能够对这种情况有所了解。简而言之,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。我正在建造node
。 v6.2.0
的版本为npm
和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" ]
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}},特别是当我觉得有些东西真的很笨我错过了。因为我知道他们在分开时工作得更好。什么在它可能会导致这种情况下如此多地增加构建时间。
答案 0 :(得分:1)
&#34; all&#34;由于execSync
和node-zopfli
构建其原生模块的问题非常缓慢,因此图像构建需要很长时间。两者都是可选的依赖项,因此安装使它们无法正常工作,但它们需要花费很长时间才能失败。
分割的图像构建使这两个软件包无法快速构建。我真的不确定这是怎么发生的,因为似乎有很多变化可能导致他们无法快速建立。
execSync模块不再存在,它对于节点0.10也是如此。
如果我从npm
中删除Dockerfile
错误修复程序,则execAsync构建会立即失败,而不是花费很长时间才能失败。
要删除权限问题,请使用npm install --unsafe-perm
以允许构建作为容器中的root
用户运行。
使用devDependencies
或[{1}}版本的全局安装,而不是两者。 ng
将从应用安装中删除npm install --production
,这意味着devDependencies
不再重复。如果您需要更多的devDependencies来完成应用程序构建,那么您可能希望采用其他方式,而不是进行全局安装,而只依赖于devDepenencies(angular-cli
)
使用./node_modules/.bin/ng
获取最新版本的node / npm,并且不要通过FROM mhart/alpine-node:6
安装nodejs
。
尽可能晚地设置apk
和ARG ENV
(即在使用它的ENV ENV
命令之前),以便环境更改不会触发完全重建图像。
在ng
之后的Dockerfile
命令中运行清理步骤时,没有图像大小可以获得(或真正丢失)。此时文件已提交到上一个图像层。
在进行重复的docker镜像构建时,对于npm使用verdacio / npm-register和/或apt-cacher-ng使用通用os包。它们将消除重复的docker构建的大部分网络开销。
所以你最终得到这样的东西:
RUN apk del build-dependencies
拥有两个Dockerfiles也没问题。因为每个人都应该做自己的事情而不是重复其他人的行动。当您从一个基本图像构建多个图像时,通常只需要需要来执行此操作。
答案 1 :(得分:0)
值得指出可能相关的是在npm安装步骤之前添加它:
RUN npm config set maxsockets 10
在旧版本的npm上它是无限的,在较新版本的它是50。 当我明确地将它设置为10时,我得到了极大的速度提升(依稀记得有人说25对他有好处)。