Добавление нового npm пакета с последующим запуском docker build выполняется очень медленно! Вот как ускорить рабочий процесс.

Нажмите здесь, чтобы опубликовать эту статью в LinkedIn »

Эта проблема

Невозможно сохранить артефакты сборки между сборками докеров, кроме как с помощью механизма кэширования слоев. Вы можете указать один или несколько томов с помощью действия VOLUME, но оно используется не во время сборки, а только во время выполнения. (т.е. когда вы делаете docker run ...).

Если вы разрабатываете с использованием npm, время для добавления нового пакета может стать очень большим! Для каждого docker build весь node_modules полностью переустанавливается, заново загружается из Интернета без ссылки на какое-либо локальное кэширование.

В этом посте я опишу технику, которая может помочь.

Решение

Во-первых, я признал поражение, пытаясь исправить это во время сборки, поскольку это просто технически невозможно с докером. Существуют инструменты, которые пытаются решить эту проблему, но они обязательно нарушают совместимость с докером (расширяя докер с отсутствующей функциональностью). Я не стремлюсь нарушать совместимость, поэтому избегаю этого.

Хитрость заключается в том, чтобы вместо этого перейти в режим, в котором вы можете добавлять новые пакеты и при необходимости извлекать их во время выполнения. Таким образом, вы можете быстро выполнять итерацию рабочего процесса разработки.

  1. Добавьте новый скрипт в ваш package.json, который будет одновременно npm install и npm start. (см. суть)
  2. Если вы используете docker-compose, измените свой docker.compose.ymlfile, чтобы использовать этот сценарий.

Это означает, что когда вы добавляете новый пакет в свой package.json, вы устанавливаете эти новые пакеты в свой контейнер без необходимости повторной сборки.

Конечно, при таком подходе вы будете получать «дельту» (т. Е. Новые пакеты с тех пор, как ваш последний docker build удаляется каждый раз, когда вы запускаете новый контейнер.

Вы можете уменьшить время, которое займет этот шаг, указав docker-compose создать том, например npm-cache и сопоставьте его с npm каталогом кеша вашего контейнера.

Чтобы получить путь к каталогу npm кеша в вашем контейнере, просто выполните docker-compose run [servicename] npm get cache. Затем вы можете изменить свой docker-compose.yml как показано.

(Не забудьте заменить /root/.npm местоположением кэша вашего собственного изображения, которое вы получили при выполнении npm get cache ранее.

Вот и все!