2017-01-05 11 views
11

Stworzyłem nową aplikację Angular2 przez angle-cli i uruchomiłem ją w Dockerze.Jak zmniejszyć rozmiar obrazu Docker za pomocą NodeJs

Na początku procesu init aplikację na moim komputerze lokalnym:

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

moich 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"] 

Wszystko jest OK, problemem jest wielkość obrazu: 939MB !!! Próbowałem użyć FROM: ubuntu: 16.04 i zainstalować na nim NodeJs (działa), ale wciąż mój obraz ma ~ 450 MB. Znam ten węzeł: alpine istnieje, ale nie jestem w stanie zainstalować w nim kanciastego-cli.

Jak zmniejszyć rozmiar obrazu? Czy konieczne jest uruchomienie "npm install" i "ng build" w Dockerfile? Spodziewałbym się zbudować aplikację na localhost i skopiować ją do obrazu. Próbowałem skopiować pliki dist dir i package.json etc, ale to nie działa (błąd startu aplikacji). Dzięki.

+1

skąd pochodzi wykorzystanie przestrzeni? 'du -h' – Sebas

+1

Użyj' historii dokowanej ', aby wyświetlić wszystkie warstwy obrazu, aby znaleźć miejsce do wykorzystania. – nwinkler

Odpowiedz

0

Do produkcji nie trzeba dystrybuować obrazu z Node.js, zależnościami NPM, itp. Wystarczy obraz, który można wykorzystać do uruchomienia pojemnika objętości danych, który zapewnia skompilowane źródła, udostępnia mapy źródłowe i inne zasoby, w rzeczywistości nie więcej niż to, co można by redystrybuować przy pomocy pakietu za pośrednictwem NPM, który można dołączyć do swojego serwera WWW.

Tak więc dla hosta CI można wybrać jedną z dystrybucjii skopiować źródła i zainstalować w niej zależności, a następnie można ponownie użyć obrazu do uruchamiania kontenerów testujących kompilacje, dopóki nie zostanie w końcu uruchomiony kontener który wykonuje kompilację produkcji, którą możesz nazwać.

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

Po zakończeniu kompilacji źródeł wewnątrz pojemnika, uruchom pojemnik, który ma objętość od pojemnika składance dołączonej i kopiowania źródła do objętości na pojemniku i pchania że do Docker upstream:

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

Spróbuj FROM mhart/alpine-node:base-6 może to zadziała.

Powiązane problemy