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

jir*_*463 11 node.js docker dockerfile angular

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

起初我在我的本地机器上启动app:

ng new project && cd project &&  "put my Dockerfile there" && docker build -t my-ui && docker run.
Run Code Online (Sandbox Code Playgroud)

我的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"]
Run Code Online (Sandbox Code Playgroud)

一切都还可以,问题是图片大小:939MB !!! 我尝试使用FROM:ubuntu:16.04并在其上安装NodeJ(它可以工作),但我的图像仍然有~450 MB.我知道节点:高山存在,但我无法在其中安装angular-cli.

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

Fil*_*vić 0

对于生产,您不需要分发带有 Node.js、NPM 依赖项等的镜像。您只需要一个可用于启动数据卷容器的镜像,该容器有效地提供已编译的源、发布源映射和其他资产只不过是您通过 NPM 通过软件包重新分发的内容,您可以将其附加到您的网络服务器。

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

docker run --name=compile-${RELEASE} ci-${RELEASE} npm run production
Run Code Online (Sandbox Code Playgroud)

完成容器内源代码的编译后,运行一个附加了编译容器中的卷的容器,并将源代码复制到容器上的卷中,然后将其推送到 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}
Run Code Online (Sandbox Code Playgroud)