У меня есть изображение Docker, давайте назовем его frontend.image
, которое я использую для сборки-сборки Jenkins. Плагин Jenkins Docker раскручивает контейнер из этого изображения и создает артефакты внутри контейнера. Это все прекрасно работает. В этом случае frontend.image
используется для создания приложения AngularJs. Частью создания этого приложения Angular является установка пакетов npm, требуемых приложением.
Этот процесс, установка npm, кажется, занимает много времени, кажется, 3 минуты, npm всегда устанавливает каждый пакет каждый раз.
Поэтому я добавил том для своего ведомого устройства, это том, смонтированный на хосте, плагин Docker будет использовать этот том каждый раз при запуске контейнера внешнего интерфейса:
Пользователь , который выполняет команду npm install
является jenkins
. npm хранит кеш, который вы можете найти с помощью команды, npm config get cache
которая выводит/home/jenkins/.npm
Вот почему у меня есть том хоста, /slaves/volumes/tsl.frontend:/home/jenkins
подключенный к моему ведомому веб-контейнеру.
Я создаю свое Angular-приложение, используя проект Jenkins, без проблем, много пакетов npm установлено. Если на моем хосте Docker запустить ssh и запустить cmd, ls /slaves/volumes/tsl.frontend
я вижу множество пакетов npm. Это означает, что мой хост том монтируется для подчиненного.
Теперь я снова собираю проект Jenkins, npm снова устанавливает каждый пакет, хотя подчиненный сборочный контейнер Docker использует монтирование тома на хосте. Я даже могу подтвердить это, установив в ведомый контейнер команду cmd, docker exec -it <some_clever_random_container_id> bash
затем cmd, а su jenkins
затем cmd, в npm cache ls
которой перечислено много кэшированных пакетов npm.
Таким образом, даже с моим томом монтирования хоста, который chmod 777
, кстати , имеет разрешения , поэтому проблем с разрешениями нет, я не могу npm install
использовать кеш.
В моей сборке Jenkins, которая раскручивает подчиненный контейнер Docker, первый cmd, который я запускаю, npm cache ls
и многие пакеты указаны в списке, не означает ли это, что мой том хоста работает должным образом, а индекс кэша npm имеет целостность, то есть не повреждена?
Я попробовал обычный npm install
cmd, который при запуске на моем локальном компьютере устанавливает все пакеты в первый раз и почти без пакетов в следующий раз. А также "взломать" кэш npm npm --cache-min 9999999 install
, взятый из этого ответа SO, а также cmdnpm --skip-installed --cache-min 9999999 install
Соответствующий вопрос был опубликован в StackOverflow.
npm cache ls
и rawls ~/.npm/* -al
в сам скрипт сборки перед любым другим шагом сборки, просто чтобы гарантировать состояние контейнера при запуске сборки.Ответы:
Наконец-то я решил эту проблему, используя кеширование слоя изображений Docker для установки npm, следуя этому ответу
Это означает, что я переместил установку npm из ведомого образа Docker в фактически внешний интерфейс, вот мой последний файл Docker, который действительно кэширует установку npm между сборками, если package.config не имеет изменений:
источник
Другой подход, который вы можете использовать, - это настроить сервер репозитория Nexus, на котором вы размещаете свои модули npm и проксируете внешние. Он не использует кеш, но поскольку ресурсы находятся в вашей локальной сети или, возможно, в одном и том же рое, это не займет много времени.
источник