У меня есть образ Docker, назовем его frontend.image
, который я использую для ведомого устройства сборки Jenkins. Дженкинс Плагин Docker будет раскручивать контейнер из этого образа и создавать артефакты внутри контейнера. Все это отлично работает. В этом случае frontend.image
используется для создания приложения AngularJs. Частью создания этого приложения Angular является установка пакетов npm, необходимых приложению.
Этот процесс, npm install, кажется, занимает много времени, кажется, 3 минуты, npm всегда каждый раз устанавливает каждый пакет.
Итак, я добавил том для своего ведомого устройства, это том, установленный на хосте, плагин Docker будет использовать этот том каждый раз, когда он запускает контейнер внешнего интерфейса:
Пользователь, выполняющий команду npm install
является jenkins
. npm хранит кеш, который вы можете найти с помощью команды npm config get cache
который выводит /home/jenkins/.npm
Вот почему у меня хост-том /slaves/volumes/tsl.frontend:/home/jenkins
установлен на моем подчиненном веб-контейнере.
Я создаю свое приложение Angular, используя проект Jenkins, сборка выполняется без проблем, установлено множество пакетов npm. Если ssh на моем хосте Docker и запустить cmd ls /slaves/volumes/tsl.frontend
Я вижу много пакетов npm. Это означает, что монтирование моего хост-тома для ведомого сработало.
Теперь я снова создаю проект Jenkins, npm снова устанавливает каждый пакет, даже если контейнер сборки Docker slave использует монтирование хоста тома. Я даже могу подтвердить, ударив по подчиненному контейнеру с помощью cmd docker exec -it <some_clever_random_container_id> bash
затем cmd su jenkins
затем cmd npm cache ls
в котором перечислены многие кэшированные пакеты npm.
Итак, даже с моим монтируемым томом хоста, у которого есть разрешения chmod 777
кстати, поэтому нет проблем с разрешениями, я не могу получить npm install
использовать кеш.
Я пробовал обычный npm install
cmd, который, когда я запускаю на своей машине localhost, устанавливает все пакеты в первый раз и почти не устанавливает пакетов в следующий раз. А также "взлом" кеша npm npm --cache-min 9999999 install
, взято из этот ТАК ответ а также cmd npm --skip-installed --cache-min 9999999 install
Я, наконец, решил это, используя кеширование слоя изображений Docker для установки npm, следуя этот ответ
Это означает, что я переместил установку npm из ведомого образа Docker в образ внешнего интерфейса, вот мой последний файл Docker, который действительно кэширует установку npm между сборками, если package.config не имеет изменений:
FROM centos:7
MAINTAINER Brian Ogden
# Not currently being used but may come in handy
ARG ENVIRONMENT
ENV NODE_VERSION 6.11.1
RUN yum -y update && \
yum clean all && \
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
yum -y makecache && \
yum -y install nginx-1.12.0 wget
# Cleanup some default NGINX configuration files we don’t need
RUN rm /etc/nginx/conf.d/default.conf
#############################################
# NodeJs Install
#############################################
#Download NodeJs package
RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \
| tar --strip-components=1 -xzf - -C /usr/local
# https://stackoverflow.com/a/35774741/1258525
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY ./package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir /app && cp -a /tmp/node_modules /app/
WORKDIR /app
COPY . /app
RUN npm run build-$ENVIRONMENT
RUN cd /app && cp -a dist/* /usr/share/nginx/html
COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf
COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]