如何使用NodeJ缩小Docker镜像的大小

时间:2017-01-05 13:12:50

标签: node.js angular docker dockerfile

我通过angular-cli创建了新的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 !!!我尝试使用FROM:ubuntu:16.04并在其上安装NodeJ(它可以工作),但我的图像仍然有~450 MB。我知道节点:高山存在,但我无法在其中安装angular-cli。

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

3 个答案:

答案 0 :(得分:1)

You can certainly use my alpine-ng image if you like.

You can also check out the dockerfile, if you want to try and modify it in some way.

我很遗憾地告诉你,即使是高山,它仍然是610MB。可以肯定的是,虽然角度编译器非常庞大,但并没有解决这个问题。

答案 1 :(得分:0)

对于生产,您不需要使用Node.js,NPM依赖项等分发图像。您只需要一个可用于启动数据卷容器的映像,该容器提供已编译的源,释放源映射和其他资产,实际上不超过您通过NPM通过包重新分发的资产,您可以附加到您的网络服务器。

因此,对于您的CI主机,您可以选择一个node:alpine发行版并复制源并在其中安装依赖项,然后您可以重新使用该图像来运行测试构建的容器,直到最终运行一个执行生产编译的容器,您可以命名。

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}

答案 2 :(得分:0)

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