Как повторно использовать кеш из сборки докера `RUN --mount=type=cache`?

Я использую новый экспериментальный синтаксис сборки докеров для многоэтапной сборки, например:

Докерфайл:

RUN --mount=type=cache,target=/home/build/.build-cache,gid=1000,uid=1001 ./build

удар:

DOCKER_BUILDKIT=1 docker build .

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

Я могу экспортировать и импортировать файлы в env, но я не знаю, где находится кеш. Любые идеи?

Или я должен экспортировать/импортировать кеш через какую-то команду докера? Я прочитал https://docs.docker.com/engine/reference/commandline/build/#specifying-external-cache-sources и https://github.com/moby/buildkit#export-cache, но мне не ясно, что конкретно относится к сборке, что к докеру, или действительно ли это применимо к этому кешу, смонтированному в команду RUN Dockerfile.

Я добавил сюда общедоступный список неудачного теста, демонстрирующий то, на что я надеялся: gist.github.com/Mahoney/85e8549892e0ae5bb86ce85339db1a71/6308f1bdb062a8982017193b96d61ec00a7698c5

И эта более поздняя версия работает, но я ею не доволен - слишком много начальной загрузки: .github.com/Mahoney/85e8549892e0ae5bb86ce85339db1a71


person Robert Elliot    schedule 28.02.2020    source источник
comment
Вы можете использовать buildx с докером, например docker buildx build ..., и экспортировать/импортировать кэш(и) слоев из реестра, файловой системы или встроенного докера в окончательный образ. среда. com/titansoft-engineering/ и github.com/docker/buildx содержат дополнительную информацию.   -  person jbielick    schedule 22.04.2020
comment
Спасибо, рассмотрю - я чувствовал, что должен что-то упустить.   -  person Robert Elliot    schedule 15.05.2020
comment
Просто чтобы продолжить это - проблема в том, что при использовании gradle в сборке с несколькими проектами кэширование слоев не так уж полезно, так как мне в значительной степени приходится делать COPY . ., сбрасывая все кэширование слоев каждый раз, когда что-то меняется. Есть способы извлечь выгоду из кэширования слоев, но их сложно поддерживать. Совместное использование домашнего каталога пользователя gradle — это, безусловно, самый разумный способ кэширования.   -  person Robert Elliot    schedule 01.07.2020


Ответы (1)


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

Однако вы, конечно, можете сделать резервную копию всего /var/lib/docker. Это не работает для удаленного движка Docker CircleCI, потому что у вас нет доступа к sudo, но работает для действий GitHub, где у вас есть.

См. пример здесь: https://github.com/Mahoney-playground/docker-cache-action

person Robert Elliot    schedule 02.03.2020
comment
Есть проблема, поднятая командой buildkit, поэтому с большей, чем обычно, вероятностью реализации, чтобы можно было контролировать, какой каталог хоста монтируется как каталог кеша: github.com/moby/buildkit/issues/1512 - person Robert Elliot; 16.11.2020
comment
и теперь есть, если вы используете docker buildx build - person Naftali aka Neal; 10.06.2021