Кажется, что кеш изображения концентратора докеров не работает

У нас есть конвейер непрерывного объединения на circleci, который делает следующее:

  • Загружает repo/image: mytag1 из каталога кеша, чтобы использовать кешированные слои
  • Создает новую версию: docker build -t repoimage: mytag2
  • Сохраняет новую версию в каталоге кэша с сохранением docker
  • Запускает тесты
  • Вставляет док-концентратор: docker push repo/image: mytag2

Проблема заключается в шаге 5. Шаг нажатия занимает 5 минут каждый раз. Если я правильно понимаю, докер-концентратор предназначен для кэширования слоев, поэтому нам не нужно повторно вводить такие вещи, как базовое изображение и зависимости, если они не обновляются.

Я запустил сборку дважды подряд, и я вижу много кроссовера в хэше слоёв. Но вместо того, чтобы "Изображение уже существует", я вижу, что "Изображение успешно нажато".

Вот результат вывода док-станции build 1 и здесь build 2

Если вы разделите эти два файла, вы увидите, что в каждой сборке различаются только 2 слоя:

< ca44fed88be6: Buffering to Disk
< ca44fed88be6: Image successfully pushed
< 5dbd19bfac8a: Buffering to Disk
< 5dbd19bfac8a: Image successfully pushed
---
> 9136b10cfb72: Buffering to Disk
> 9136b10cfb72: Image successfully pushed
> 0388311b6857: Buffering to Disk
> 0388311b6857: Image successfully pushed

Итак, почему все изображения должны перетаскиваться каждый раз?

Ответ 1

Использование другого тега создает другое изображение, которое при нажатии не может полагаться на кеш.

Например, две команды:

$ docker commit -m "thing" -a "me" db65bf421f96 me/thing:v1
$ docker commit -m "thing" -a "me" db65bf421f96 me/thing:v2

дают совершенно отличные отпечатки, даже если они были созданы из одинаковых изображений (db65bf421f96). При нажатии, докер-хаб должен относиться к ним как к совершенно отдельным изображениям, которые можно увидеть с помощью:

$ docker images
REPOSITORY     TAG      IMAGE ID
me/thing       v2       f14aa8ac6bae
me/thing       v1       c7d72ccc1d71

Идентификаторы изображений уникальны и, следовательно, изображения уникальны, даже если они различаются по тегам.

Можно сказать, что "докер должен распознавать их как бит для бит идентичных" и, таким образом, рассматривать их как кэшируемые. Но это еще не все.

Единственный сюрприз для меня в вашем примере - это то, что у вас есть все дублированные идентификаторы изображений.

Авторитарная (если она меньше пояснительная) документация может быть найдена в docker в разделе "Создайте собственные изображения".

Ответ 2

Процесс должен работать, как вы описали. На самом деле мы создаем все наши изображения таким образом без проблем. Обычно есть только несколько изменений в верхних слоях, и только те, которые вставляются в реестр, - иначе вся концепция слоев изображения будет бесполезной.

См. здесь для примера. Только два самых верхних слоя изменены, нажаты для :latest, а для :4.0.2 нет никакого нажатия. Мы помещаем изображения тегами git, а для некоторых проектов мы даже тегируем изображения с помощью git describe - чтобы получить функциональность отката на всякий случай.

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

Несколько вещей, которые следует обратить внимание на настройку: мы используем самозагружаемый GitLab CI с настраиваемым runner, который запускается docker и docker-compose на изолированном хосте с Docker 1.9.1, но это не должно иметь никакого значения.

В версии реестра могут быть и различия. У меня было чувство (но я не уверен на 100%), что некоторые старые репозитории на DockerHub все еще работают в реестре v1, новее всегда на v2 - так вы можете попробовать создать новое репо и посмотреть, не возникла ли проблема.

Обратите внимание, что поведение для тегов, описанных выше, применяется только при нажатии одного и того же имени изображения, если вы нажимаете одинаковые слои изображения на другое имя, вам всегда нужно нажимать все слои, несмотря на то, что все слои должны уже существует в реестре, поэтому я думаю, что repo/image:mytag1 и repoimage:mytag2 действительно идут в repo/image, а недостающая косая черта - это просто опечатка.

Другая причина может заключаться в том, что ваши изображения построены на разных хостах в Circle CI, но тогда вы также должны получить разные идентификаторы слоев, поэтому я думаю, что это не очень вероятно.

Я предлагаю создать изображение вручную и попытаться воспроизвести проблему или обратиться в Circle CI об этой проблеме.