Как избежать пакетов npm build node.js каждый раз при создании образа Docker через Circle CI? - PullRequest
0 голосов
/ 14 июля 2020

Я развертываю свое приложение Node.Js через AWS ECS Docker контейнер, используя Circle CI.

Однако каждый раз, когда я создаю новый образ, он запускает npm build (потому что он находится в моем Dockerfile) и каждый раз загружает и строит все модули node заново. Затем он загружает новый образ в репозиторий AWS ECS.

Поскольку моя среда остается прежней, я не хочу, чтобы он каждый раз собирал эти пакеты. Как вы думаете, возможно ли для Docker действительно обновлять существующий образ вместо того, чтобы каждый раз создавать новый с нуля со всеми модулями? Это вообще хорошая практика?

Я думал о следующем рабочем процессе:

  1. Проверить, есть ли новые пакеты Node по сравнению с предыдущим образом
  2. Если да , запустите npm build
  3. Если нет, просто сохраните старую папку node_modules, не запускайте сборку и просто обновите код
  4. Deploy

Что был бы лучший способ сделать это?

Вот мой Dockerfile

FROM node:12.18.0-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
COPY package.json package-lock.json* ./
RUN npm install
RUN npm install pm2 -g
EXPOSE 3000
CMD [ "pm2-runtime", "ecosystem.config.js"]

Мой Circle CI рабочий процесс (из ./circleci/config.yml):

workflows:
  version: 2.1
  test:
    jobs:
      - test
      - aws-ecr/build-and-push-image:
          create-repo: true
          no-output-timeout: 10m
          repo: 'stage-instance'

1 Ответ

1 голос
/ 14 июля 2020

Переместите строку COPY . . после строки RUN npm install.

Как работает кэширование слоев Docker, повторный запуск строки RUN будет пропущен, если он знает, что уже запустить его. Итак, учитывая этот фрагмент файла Dockerfile:

FROM node:12.18.0-alpine
WORKDIR /usr/src/app
COPY package.json package-lock.json* ./
RUN npm install

Docker отслеживает хэши файлов, в которых он COPY находится. Когда он достигает строки RUN, если изображение до этого момента идентичен ранее созданному, он также будет пропускать строку RUN.

Если у вас сначала указано COPY . ., то при изменении любого файла в исходном дереве он впоследствии сделает недействительным кеш слоя для всего. Если вы сначала копируете только package.json и файл блокировки, то npm install запускается повторно только в случае изменения любого из этих двух файлов.

(CircleCI может выполнять или не выполнять кэширование одного и того же слоя, но " установите зависимости, затем скопируйте приложение в "типичную оптимизацию на уровне Docker.)

...