2017-01-18 5 views
2

Docker медленно записывает файловую систему хоста при использовании томов. Это делает задачи вроде npm install, в NodeJS, невероятно болезненными. Как я могу исключить папку node_modules из тома, чтобы сборка была быстрее?Как увеличить скорость сборки докеров при использовании томов с установленным томом

ответ

3

Общеизвестно, что поддерживаемая поддержка громкоговорителя Docker на macOS является патетически медленной (click here for more info). Для разработчиков Node это означает, что запуск вашего приложения невероятно медленный из-за требуемой команды node install. Ну, вот быстрый хитрость, чтобы обойти эту медлительность.

Во-первых, быстрый взгляд на проект:

uber-cool-microservice example http://www.fredlackey.com/content/images/2017/01/Screen-Shot-2017-01-17-at-8.23.51-PM.png

Короче говоря, я картографирования все в корне моего проекта (./) к одному из томов контейнера. Это позволяет использовать виджеты, такие как 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 в корневом каталоге вашего проекта, в файловой системе хоста. Это просто не будет напишите.

The original article is on my blog.

 Смежные вопросы

  • Нет связанных вопросов^_^