Как уменьшить размер изображения Docker с помощью NodeJs

Я создал новое Angular2 приложение angular -cli и запустил его в 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 МБ. Я знаю, что node: alpine существует, но я не могу установить в него angular -cli.

Как уменьшить размер изображения? Нужно ли запускать "npm install" и "ng build" в Dockerfile? Я ожидал бы создать приложение на локальном хосте и скопировать его в изображение. Я попытался скопировать файлы dist dir и package.json и т.д., Но это не сработает (сбой запуска приложения). Спасибо.

Ответ 1

Вы можете, конечно, использовать мое альпийское изображение, если хотите.

Вы также можете проверить файл докеров, если вы хотите каким-то образом попробовать его изменить.

Я с сожалением сообщаю вам, что даже на основе альпийского, это все еще 610 МБ. Совершенно очевидно, но не обойти тот факт, что компилятор angular сильно огромен.

Ответ 2

Для производства вам не нужно распространять изображение с зависимостями 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}

Ответ 3

Попробуйте FROM mhart/alpine-node:base-6 возможно, он будет работать.