如何用NodeJs缩小Docker镜像的大小

我通过angular-cli创build了新的Angular2应用程序,并在Docker中运行它。

起初,我在本地机器上启动应用程序:

ng new project && cd project && "put my Dockerfile there" && docker build -t my-ui && docker run. 

我的Dockerfile

 FROM node RUN npm install -g angular-cli@v1.0.0-beta.24 && npm cache clean && rm -rf ~/.npm RUN mkdir -p /opt/client-ui/src WORKDIR /opt/client-ui COPY package.json /opt/client-ui/ COPY angular-cli.json /opt/client-ui/ COPY tslint.json /opt/client-ui/ ADD src/ /opt/client-ui/src RUN npm install RUN ng build --prod --aot EXPOSE 4200 ENV PATH="$PATH:/usr/local/bin/" CMD ["npm", "start"] 

一切都好,问题是图像的大小:939MB! 我试图使用从:Ubuntu的:16.04和安装NodeJs(它的工作原理),但仍然我的形象有〜450 MB。 我知道节点:高山存在,但我不能在其中安装angular-cli。

我如何缩小图像大小? 是否有必要在Dockerfile中运行“npm install”和“ng build”? 我希望在本地主机上构build应用程序并将其复制到图像。 我试图复制dist dir和package.json等文件,但它不起作用(应用程序启动失败)。 谢谢。

如果你喜欢,你当然可以使用我的阿尔卑斯山的图像。

你也可以检查出dockerfile,如果你想尝试和修改它以某种方式。

我很遗憾地通知你,即使在高山上,它仍然是610MB。 一个可以肯定的改进,但是没有解决angular度编译器非常庞大的事实。

对于生产,您不需要分发具有Node.js,NPM依赖性等的图像。您只需要一个可用于启动数据卷容器的图像,该容器可以有效地提供编译源,发布源图和其他资源不会超过你通过NPM重新分配一个包,你可以附加到你的networking服务器。

因此,对于您的CI主机,您可以select一个node:alpine发行版并复制源代码并在其中安装依赖项,然后可以重新使用该映像来运行testing构build的容器,直到您最终运行一个执行了容器一个生产编辑,你可以命名。

 docker run --name=compile-${RELEASE} ci-${RELEASE} npm run production 

编译完容器中的源代码之后,运行一个容器,该容器包含来自编译容器的卷,并将源复制到容器上的卷上,并将其推送到您的Docker上游:

 docker run --name=release-${RELEASE} --volumes-from=compile-${RELEASE} -v /srv/public busybox cp -R /myapp/dist /srv/public docker commit release-${RELEASE} release-${RELEASE} myapp:${RELEASE} 

尝试FROM mhart/alpine-node:base-6也许它会工作。