首页 > 解决方案 > 使用带有 R 包的 docker buildkit 缓存

问题描述

我正在尝试使用 docker buildkit 方法来缓存包以加快将包添加到 docker 容器中。我从python 和 apt-get 包的说明以及关于在构建 Docker 时缓存 python 包的有用 Stackexchange 答案中了解了它。对于 Python 和 apt-get 我可以让它工作,但我不能让它为 R 包工作。

在 Python 的 Dockerfile 中,我可以更改:

RUN pip install -r requirements.txt

to (并且需要 Dockerfile 顶部的注释)

# syntax=docker/dockerfile:experimental
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt

然后,当我将包添加到requirements.txt文件中时,而不是重新下载和构建包,pip 能够重新使用它所做的所有工作。所以 buildkit 缓存挂载在 docker 的镜像层之外增加了一层缓存。这是一个巨大的节省时间。我希望为 r-packages 设置类似的东西。

这是我尝试过的适用于 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

我想我不明白:

  1. buildkit 的工作原理。它是否在容器内构建容器?即缓存路径在“构建容器”上?
  2. 需要指定什么作为 R 的目标,以注意到它已经下载(并且可能已构建)。

我怀疑它与keep.source安装 R 包时的命令有关,如本问题所述

标签: rdockerdocker-buildkit

解决方案


推荐阅读