首页 > 解决方案 > 确定 R 中 docker 映像所需的软件包

问题描述

我有一个非常简单的脚本:

library(datasets)
library(caret)

data(iris)

index <- createDataPartition(iris$Species, p=0.80, list=FALSE)
testset <- iris[-index,]
trainset <- iris[index,]

model = train(Species ~ ., 
                  data=trainset, 
                  method="rpart", 
                  trControl = trainControl(method = "cv"))

正如您可能知道的那样,该脚本将 rpart 分类模型拟合到 iris 数据集。所以我知道我的 docker 图像至少需要插入符号(或者可能只是 rpart,因为 docker 用于对模型进行评分?)。我认为 R 还单独基于插入符语句加载了一些其他包。因此,为了尝试确定我的 docker 映像需要哪些包,我想我会这样做:

x <- .packages(TRUE)
x

不幸的是,这给了我一个(太?)很长的包列表,但也许它们都是运行这个脚本所必需的(我理解插入符号构建在许多包之上)。请问获得所需软件包的明确列表的最佳做法是什么?

PS:

顺便说一句,数据集是 R 基础的一部分吗?

标签: rdocker

解决方案


我的建议是创建一个新的 R 项目并使用该renv包进行依赖管理。请参阅有关如何设置的文档。在 RStudio 中创建新项目时,您甚至可以选择“将此项目使用 renv”选项。

在构建 Docker 映像之前,renv::snapshot()最后运行一次,它将所需的依赖项保存到您的renv.lock文件中。

然后,在您的 Dockerfile 中,安装renv,将文件复制renv.lock到容器中,以及renv::restore()构建映像时的依赖项。由于renv旨在用于交互式使用,因此您必须为无监督安装设置一些特殊参数——将其作为样板起点:

# Copy renv.lock file
COPY ./renv.lock /renv.lock

# Install R packages
RUN R -e "install.packages('renv')"
RUN R -e "renv::consent(provided = TRUE)"
RUN R -e "renv::restore(prompt = FALSE)"

您还可以查看有关在Docker 中使用 renv的专用文档。

这应该安装脚本所需的所有必要依赖项。


推荐阅读