В последние несколько дней я ломал голову над проблемами со сборкой Docker и --cache-from
, и это немного расстраивает отсутствие документации для правильного поведения --cache-from
, хотя есть некоторая дезинформация вwild.
Я думаю, что мне наконец-то удалось исправить проблемы, которые у меня были на моей стороне, после нескольких идей, которыми я собираюсь поделиться здесь, в надежде, что это будет полезно кому-то еще.
При предоставлении нескольких --cache-from
порядок имеет значение!
Порядок очень важен, потому что при первом совпадении Docker перестанет искать другие совпадения и будет использовать его длявсе остальные команды .
Это объясняет тот, кто реализовал эту функцию в Github PR :
При использовании нескольких --cache-from они проверяются на попадание в кэш в порядке, указанном пользователем.Если одно из изображений вызывает попадание в кеш для команды, то только это изображение используется для остальной части сборки.
В первоначальном предложении о покупке билетов также есть более длинное объяснение :
Задать несколько изображений --cache-from немного проблематично.Если оба изображения совпадают, нет никакого способа (без выполнения нескольких проходов) выяснить, какое изображение использовать.Таким образом, мы выбираем первый (пусть пользователь контролирует приоритет), но это может быть не самая длинная цепочка, которую мы могли бы найти в конце.Если мы разрешаем сопоставление одного изображения для некоторых команд, а затем переключаемся на другое изображение с более длинной цепью, мы рискуем просочиться в некоторую информацию между изображениями, поскольку мы проверяем только историю и слои для кэширования.В настоящее время я оставил это так, что если мы получим совпадение, мы используем это целевое изображение только для остальных команд.
Использование --cache-from
является исключительным: локальный кэш Docker не будет использоваться
Это означает, что он не добавляет новые источники кэширования, предоставленные вами теги изображений будут единственными источниками кэширования для сборки Docker.
Даже если вы только что создали одно и то же изображение локально, следующеекогда вы запускаете для него сборку Docker, чтобы воспользоваться кешем, вам нужно:
предоставить правильный тег с --cache-from
(и с правильным приоритетом);или
вообще не использовать --cache-from
(так что будет использоваться локальный кеш сборки)
Если родительское изображение изменяется,кеш будет признан недействительным
Например, если у вас есть изображение на основе docker:stable
, а docker:stable
обновляется, кэшированные сборки вашего изображения больше не будут действительными, так как слои базового изображения былиизменено.
Вот почему, если вы конфигурируете сборку CI, также может быть полезно docker pull
базовый образ и включение его в --cache-from
, как упоминалось в этомпрокомментируйте еще одно обсуждение Github .