2017-01-05 39 views
11

我通過angular-cli創建了新的Angular2應用程序並在Docker中運行它。如何使用NodeJs縮小Docker鏡像的大小

起初我初始化我的本地機器上的應用程序:

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

我Dockerfile

FROM node 

RUN npm install -g [email protected] && 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並在其上安裝NodeJs(它有效),但仍然是我的映像有〜450 MB。我知道節點:高山存在,但我不能在其中安裝angular-cli。

如何縮小圖像大小?是否有必要在Dockerfile中運行「npm install」和「ng build」?我希望在本地主機上構建應用程序並將其複製到圖像。我試圖複製dist dir和package.json等文件,但它不起作用(應用程序啓動失敗)。謝謝。

+1

空間使用來自哪裏? 'du -h' – Sebas

+1

使用'docker history '顯示圖像的所有圖層以找到空間的使用位置。 – nwinkler

回答

0

對於生產,您不需要使用Node.js,NPM依賴關係等來分發圖像。您只需要一個可用於啓動數據卷容器的圖像,該容器提供編譯源,發佈源映射和其他資產,實際上不會超過您通過NPM重新分配的包,您可以附加到您的網絡服務器。

因此,對於您的CI的主機,你可以挑選node:alpine分佈之一,並複製源,並在其中安裝的依賴關係,那麼你就可以重新使用圖像用於運行測試的建立,直到你最終運行的容器容器執行生產編譯,您可以命名。

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

你已經編譯完成後的容器內源之後,運行具有連接編譯容器體積的容器和源複製到卷在容器上推,爲您的碼頭工人上游:

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} 
0

嘗試FROM mhart/alpine-node:base-6也許它會工作。