Добавление нового npm
пакета с последующим запуском docker build
выполняется очень медленно! Вот как ускорить рабочий процесс.
Нажмите здесь, чтобы опубликовать эту статью в LinkedIn »
Эта проблема
Невозможно сохранить артефакты сборки между сборками докеров, кроме как с помощью механизма кэширования слоев. Вы можете указать один или несколько томов с помощью действия VOLUME
, но оно используется не во время сборки, а только во время выполнения. (т.е. когда вы делаете docker run ...
).
Если вы разрабатываете с использованием npm
, время для добавления нового пакета может стать очень большим! Для каждого docker build
весь node_modules
полностью переустанавливается, заново загружается из Интернета без ссылки на какое-либо локальное кэширование.
В этом посте я опишу технику, которая может помочь.
Решение
Во-первых, я признал поражение, пытаясь исправить это во время сборки, поскольку это просто технически невозможно с докером. Существуют инструменты, которые пытаются решить эту проблему, но они обязательно нарушают совместимость с докером (расширяя докер с отсутствующей функциональностью). Я не стремлюсь нарушать совместимость, поэтому избегаю этого.
Хитрость заключается в том, чтобы вместо этого перейти в режим, в котором вы можете добавлять новые пакеты и при необходимости извлекать их во время выполнения. Таким образом, вы можете быстро выполнять итерацию рабочего процесса разработки.
- Добавьте новый скрипт в ваш
package.json
, который будет одновременноnpm install
иnpm start
. (см. суть) - Если вы используете
docker-compose
, измените свойdocker.compose.yml
file, чтобы использовать этот сценарий.
Это означает, что когда вы добавляете новый пакет в свой 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
ранее.
Вот и все!