Docker медленно записывает файловую систему хоста при использовании томов. Это делает задачи вроде npm install
, в NodeJS, невероятно болезненными. Как я могу исключить папку node_modules
из тома, чтобы сборка была быстрее?Как увеличить скорость сборки докеров при использовании томов с установленным томом
ответ
Общеизвестно, что поддерживаемая поддержка громкоговорителя Docker на macOS является патетически медленной (click here for more info). Для разработчиков Node это означает, что запуск вашего приложения невероятно медленный из-за требуемой команды node install
. Ну, вот быстрый хитрость, чтобы обойти эту медлительность.
Во-первых, быстрый взгляд на проект:
Короче говоря, я картографирования все в корне моего проекта (./
) к одному из томов контейнера. Это позволяет использовать виджеты, такие как gulp.watch()
и nodemon
, для автоматического перезапуска проекта или ввода любого нового кода при каждом изменении файла.
Это 50% от реальной проблемы!
Поскольку корень проекта в настоящее время отображается в рабочей директории внутри контейнера, вызывая npm install
причины node_modules
быть создан в корне ... которая на самом деле в файловой системе хоста. Именно здесь невероятно медленные смонтированные докеры Docker пинают проект в наг. Как есть, вы могли бы потратить до пять минут, ожидая вашего проекта, когда вы выйдете docker-compose up
.
«Ваша установка Docker должна быть неправильной!»
Как вы увидите, Докер довольно ваниль для этого проекта.
Во-первых, вы «оле Dockerfile:
FROM ubuntu:16.04
MAINTAINER "Fred Lackey" <[email protected]>
RUN mkdir -p /var/www \
&& echo '{ "allow_root": true }' > /root/.bowerrc \
&& apt-get update \
&& apt-get install -y curl git \
&& curl -sL https://deb.nodesource.com/setup_6.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g bower gulp gulp-cli jshint nodemon npm-check-updates
VOLUME /var/www
EXPOSE 3000
И, конечно же, любимая docker-compose.yml
:
version: '2'
services:
uber-cool-microservice:
build:
context: .
container_name: uber-cool-microservice
command:
bash -c "npm install && nodemon"
volumes:
- .:/var/www
working_dir: /var/www
ports:
- "3000"
Как вы можете видеть, как есть это тестовый проект постное, значит, и работает как ожидалось .... за исключением того, что npm install
является sloooooooooow.
На данный момент, вызывая npm install
причины всех зависимостей проекта должен быть установлен объему, который, как мы все знаем, является хост файловой системы. Именно здесь возникает боль.
«Итак, что это за« трюк », о котором вы говорили?»
Если бы только мы могли извлечь выгоду из наличия корня проекта отображенной в объеме, но каким-то образом исключитьnode_modules
и позволяют его должны быть записаны в объединение файловой системы Docker в внутри контейнера.
В соответствии с документами Докера, исключая папку с тома , невозможно. Который, имеет смысл, я думаю.
Однако является Фактически возможен!
Трюк? Просто! A дополнительные том крепление!
Добавляя один строку в Dockerfile
:
FROM ubuntu:16.04 MAINTAINER "Fred Lackey" RUN mkdir -p /var/www \ && echo '{ "allow_root": true }' > /root/.bowerrc \ && apt-get update \ && apt-get install -y curl git \ && curl -sL https://deb.nodesource.com/setup_6.x | bash - \ && apt-get install -y nodejs \ && npm install -g bower gulp gulp-cli jshint nodemon npm-check-updates VOLUME /var/www VOLUME /var/www/node_modules EXPOSE 3000
... и одна линия файла docker-compose.yml
...
version: '2' services: uber-cool-microservice: build: context: . container_name: uber-cool-microservice command: bash -c "npm install && nodemon" volumes: - .:/var/www - /var/www/node_modules working_dir: /var/www ports: - "3000"
Вот так!
В случае, если вы пропустили его, мы добавили:
VOLUME /var/www/node_modules
и
- /var/www/node_modules
сказать, что!?!?
Короче говоря, дополнительный объем вызывает Docker создать внутренние крючки внутри контейнера (папки, и т.д.) и подождать, пока она будет установлена. Поскольку мы находимся никогда не монтируя папку, мы в основном обманываем Docker только для записи в папку внутри контейнера.
Конечный результат мы можем установить корень нашего проекта, воспользоваться инструментами, как gulp.watch()
и nodemon
, при написании содержания node_modules
к гораздо быстрее, объединение файловой системы.
Quick Note Re:
node_modules
:
По какой-то причине, в то время как с помощью этой техники, Docker прежнему будет создавать папкуnode_modules
в корневом каталоге вашего проекта, в файловой системе хоста. Это просто не будет напишите.