Docker сборка не использует кеш от npm ci - PullRequest
0 голосов
/ 25 марта 2020

Я создал свой Dockerfile с вниманием к использованию docker системы кеша. Я добавляю файлы package.json и package-lock.json в чистый контейнер, а затем запускаю команду npm ci. Я ожидаю, что он будет использоваться из кэша, если package.json и package-lock.json не были изменены, но он продолжает работать. Я что-то пропустил? Что-то не так с моим Dockerfile?

FROM node:13.10.1-stretch as base

ADD package.json /app/package.json
ADD package-lock.json /app/package-lock.json
WORKDIR /app

RUN npm ci --unsafe-perm

Вывод, который я получаю:

Step 1/12 : FROM node:13.10.1-stretch as base
  ---> 7aef30ae6655
 Step 2/12 : ADD package.json /app/package.json
  ---> ce655a3453f2
 Step 3/12 : ADD package-lock.json /app/package-lock.json
  ---> 797cda1e10b2
 Step 4/12 : WORKDIR /app
 Removing intermediate container 5b6929b80ad6
  ---> 80c2aac903c5
 Step 5/12 : RUN npm ci --unsafe-perm
  ---> Running in 7732a8aca146
 > fsevents@1.2.12 install /app/node_modules/webpack-dev-server/node_modules/fsevents
 > node-gyp rebuild
 make: Entering directory '/app/node_modules/webpack-dev-server/node_modules/fsevents/build'
   SOLINK_MODULE(target) Release/obj.target/.node
   COPY Release/.node
 make: Leaving directory '/app/node_modules/webpack-dev-server/node_modules/fsevents/build'
[...]

1 Ответ

0 голосов
/ 25 марта 2020

Предполагая, что вы не запускаете другие команды до добавления package.json, ваш Dockerfile в порядке, и слой, добавляющий файл вашего пакета, кэшируется. Например, мы создаем простой Dockerfile, который просто добавляет ваш package.json файл конфигурации:

FROM node:13.10.1-stretch as base
ADD package.json /app/package.json

Первый запуск:

$ docker build -t so-example .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM node:13.10.1-stretch as base
13.10.1-stretch: Pulling from library/node
[...]
Status: Downloaded newer image for node:13.10.1-stretch
 ---> 7aef30ae6655
Step 2/2 : ADD package.json /app/package.json
 ---> a7bb80c06ecb
Successfully built a7bb80c06ecb
Successfully tagged so-example:latest

Второй запуск

$ docker build -t so-example .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM node:13.10.1-stretch as base
 ---> 7aef30ae6655
Step 2/2 : ADD package.json /app/package.json
 ---> Using cache
 ---> a7bb80c06ecb
Successfully built a7bb80c06ecb
Successfully tagged so-example:latest

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

  • Выполните команду сборки дважды. Кэширование может работать только после первого запуска
  • Убедитесь, что никакие другие шаги, которые вы, возможно, не опубликовали здесь, не были выполнены в вашем Dockerfile, который делает недействительным кеш
  • Выполняются ли какие-либо команды очистки? Что-то вроде docker prune или docker image prune (или ручной список / удаление изображений в старых версиях) приведет к удалению вашего изображения
  • Проверка / публикация ваших звонков, как вы строите изображение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...