2016-01-19 3 views
11

Мы имеем непрерывный трубопровод интеграции на circleci, что делает следующее:Docker кэш ступица изображения работать

  1. Грузы репо/изображение: MyTag1 из каталога кэша, чтобы иметь возможность использовать кэшированные слои
  2. строит новую версию: докер построить -t repoimage: mytag2
  3. сохраняет новую версию в каталог кэша с грузчиком Сохранить
  4. запускает тесты
  5. выталкивает Docker хаб: докер толчок репо/изображение: myta g2

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

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

Here's выхода построить 1 в Докер толчка и here's 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 

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

+0

Какая версия докера работает в CircleCI? Интересно, это ошибка? что произойдет, если вы несколько раз нажмете * тот же образ/тег *? В принципе, докер * должен * проверить наличие слоя, разрешить его в том же репозитории. Кроме того, вы нажимаете на концентратор докеров? – thaJeztah

+0

Например, https://github.com/docker/docker/issues/18866 – thaJeztah

+0

yep нажав на тот же репо в докер-хабе. Я зарегистрировал проблему здесь (https://github.com/docker/docker/issues/19583), на которой были протестированы еще несколько тестов на основе ваших предложений, и я опубликую дополнительную информацию там – jtmarmon

ответ

1

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

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

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

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

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

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

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

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

Авторитетный (если менее толковейший) documentation can be found at docker в «Создайте свои собственные изображения».

+0

welp, что раздражает. Спасибо за информацию! Конечно, люди не все ждут 10-минутных сборок только потому, что они используют докер ... это единственный обходной путь просто перетащить один и тот же тег (перезаписать старый)? Похоже на грубый подход ко мне – jtmarmon

+0

@jtmarmon Я так же новичок в докере, как и все. Я не думаю, что это необоснованное поведение, которое в настройке CI, сборки должны быть помечены одинаково. Для вас может быть смысл иметь внутренний номер сборки, который не является частью тега. Это не так сильно отличается от мета-тега докера: последний, если я получаю изображение: последнее, это точно что я хочу, даже если он отличается от вчерашнего изображения: последний. – msw

+0

как откат к старой версии кода без наличия нового тега для развертывания. – jtmarmon

0

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

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

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

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

Там могут быть также различия в версии реестра, у меня было ощущение (но я не уверен на 100%), что некоторые старые сделки РЕПО на DockerHub все еще работают на реестре v1, новые из них всегда на v2 - так что вы можете попробовать создавая новое репо и выясняйте, сохраняется ли проблема.

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

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

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