Использование кеширования docker buildkit с R-пакетами
Я пытаюсь использовать подход docker buildkit для кеширования пакетов, чтобы ускорить добавление пакетов в контейнеры докеров. Я узнал об этом из инструкций для пакетов python и apt-get и из полезного ответа Stackexchange по кешированию пакетов python при сборке Docker. Для Python и apt-get я могу заставить это работать, но не могу заставить его работать для пакетов R.
В Dockerfile для Python я могу изменить:
RUN pip install -r requirements.txt
в (и необходим бит для просмотра комментария в верхней части файла Dockerfile)
# syntax=docker/dockerfile:experimental
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
А потом, когда я добавляю пакет в requirements.txt
вместо повторной загрузки и сборки пакетов, pip может повторно использовать всю проделанную работу. Таким образом, монтирование кеша buildkit добавляет уровень кеширования за пределы слоев изображений в докере. Это огромная экономия времени. Я надеюсь настроить что-то подобное для r-пакетов.
Вот то, что я пробовал, работает для apt-get, но не для r-packges. Я также пробовал сinstall2.r
сценарий.
# syntax=docker/dockerfile:experimental
FROM rocker/tidyverse
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \
apt update && apt install -y gcc \
zsh \
vim
COPY ./requirements.R .
RUN --mount=type=cache,target=/usr/local/lib/R/site-library Rscript ./requirements.R
Думаю, я не понимаю:
- Как работает buildkit. Создает ли контейнеры внутри контейнера? т.е. путь кеша находится в "контейнере сборки"?
- Что нужно указать в качестве цели для R, чтобы заметить, что он уже загружен (и, возможно, построен).
Я подозреваю, что это как-то связано с keep.source
при установке пакета R, как обсуждается в этом вопросе