Кэширование артефактов для многоэтапных сборок докеров - PullRequest
0 голосов
/ 08 октября 2018

У меня есть Dockerfiles, подобные этому

# build-home
FROM node:10 AS build-home
WORKDIR /usr/src/app
COPY /home/package.json /home/yarn.lock /usr/src/app/
RUN yarn install
COPY ./home ./
RUN yarn build

# build-dashboard
FROM node:10 AS build-dashboard
WORKDIR /usr/src/app
COPY /dashboard/package.json /dashboard/yarn.lock /usr/src/app/
RUN yarn install
COPY ./dashboard ./
RUN yarn build

# run
FROM nginx
EXPOSE 80
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build-home /usr/src/app/dist /usr/share/nginx/html/home
COPY --from=build-dashboard /usr/src/app/dist /usr/share/nginx/html/dashboard

Здесь создается два реагирующих приложения, а затем артефакты сборки помещаются в nginx.Чтобы улучшить производительность сборки, мне нужно кэшировать папку dist на этапах сборки build-home и build-dashboard.Для этого я создаю volume in docker-compose.yml

...
  web:
    container_name: web
    build:
      context: ./web
    volumes:
      - ./web-build-cache:/usr/src/app
    ports:
      - 80:80
    depends_on:
      - api

Я остановился на этом этапе, потому что я не понимаю, как сначала добавить volume, созданный docker-compose для build-home stage, и после добавления этого volume к build-dashboard.Может быть, мне следует создать два тома и прикрепить каждый к каждому из этапов сборки, но как это сделать?

ОБНОВЛЕНИЕ:

Начальная сборка.

Домашнее приложение:

  1. Установленные модули: 100,91 с
  2. Создание приложения: 39,51 с

Приложение для панели управления:

  1. Установленные модули: 100,91 с
  2. Сборка приложения: 50,38 с

Общее время:

real    8m14.322s
user    0m0.560s
sys     0m0.373s

Вторая сборка (без изменения кода или зависимостей):

Домашнее приложение:

  1. Установка модулей: использование кеша
  2. Создание приложения: использование кеша

Приложение Dashboard:

  1. Установка модулей: использование кеша
  2. Создание приложения: использование кеша

Общее время:

real    0m2.933s
user    0m0.309s
sys     0m0.427s

Третья сборка (с небольшим изменением кода в первом приложении):

Домашнее приложение:

  1. Установка модулей: использование кеша
  2. Сборкаприложение: 50.04 с

ДашбоПриложение ARD:

  1. Установка модулей: использование кеша
  2. Создание приложения: использование кеша

Общее время:

real    0m58.216s
user    0m0.340s
sys     0m0.445s

Начальная сборка домашнего приложения без Docker: 89,69

real    1m30.111s
user    2m6.148s
sys     2m17.094s

Вторая сборка домашнего приложения без Docker, папка dist существует на диске (без кода илиизменение зависимостей): 18,16

real    0m18.594s
user    0m20.940s
sys     0m2.155s

Третья сборка домашнего приложения без Docker, папка dist существует на диске (с небольшими изменениями в коде): 20,44 с

real    0m20.886s
user    0m22.472s
sys     0m2.607s

В docker-контейнере третьи сборки приложения в 2 раза длиннее.Это показывает, что если результат первой сборки находится на диске, другие сборки завершаются быстрее.В контейнере Docker все сборки после первой выполняются столько же, сколько и первой, поскольку папка dist отсутствует.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Если вы используете многоэтапные сборки, значит, есть проблема с кешем докера.Окончательное изображение не имеет слоев с шагами сборки.Используя --target и --cache-from вместе, вы можете сохранить эти слои и повторно использовать их при перестройке.

Вам нужно что-то вроде

docker build \
  --target build-home \
  --cache-from build-home:latest \
  -t build-home:latest 


docker build \
  --target build-dashboard \
  --cache-from build-dashboard:latest \
  -t build-dashboard:latest 


docker build \
  --cache-from build-dashboard:latest \
  --cache-from build-home:latest \
  -t my-image:latest \

Более подробную информацию вы можете найти на https://andrewlock.net/caching-docker-layers-on-serverless-build-hosts-with-multi-stage-builds---target,-and---cache-from/

0 голосов
/ 08 октября 2018

Вы не можете использовать тома при построении образа, и в любом случае Docker уже выполняет запрашиваемое кеширование.Если вы оставите свой Dockerfile как есть и не пытаетесь добавить свой код в томах в docker-compose.yml, вы должны получить кэширование встроенных файлов Javascript для восстановления доступа, как вы ожидаете.

Когда вызапустить docker build, Докер просматривает каждый шаг по очереди.Если входные данные для шага не изменились, сам шаг не изменился и все добавляемые файлы не изменились, то Docker просто повторно использует результат выполнения этого шага ранее.В вашем Dockerfile, если вы измените только конфигурацию nginx, он пропустит все этапы сборки Javascript и повторно использует их результаты, полученные в предыдущий раз.

(Другой соответствующий метод, который у вас уже есть, состоит в том, чтобы создавать приложения в два этапа: сначала скопировать в файлы, такие как package.json и yarn.lock, которые называют зависимости, и установить зависимости, а затем скопировать и собрать приложение. Поскольку этап «установки зависимостей» часто занимает много времени изависимости меняются относительно редко, вы хотите, чтобы Docker повторно использовал каталог node_modules последней сборки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...