将 private/local R 包安装到 Docker 图像中

Installing a private/local R Package into Docker Image

与问题 here 类似,我无法将自定义的 local/private R 包安装到 Docker 图像中,用于我一直在处理的闪亮应用程序。 GitHub 和我需要的 CRAN 的所有远程包都安装得很好。但是在尝试 运行 docker 图像后找不到我的本地应用程序。

Error in library(blah) : there is no package called ‘blah’

我使用 devtools::build() 在 Windows 10 上构建了我的本地包,它生成了一个 .tar.gz 文件,据我所知,该文件 应该 在 Windows 和 Linux 之间可互操作(如果我错了请纠正我)。

我的Docker文件中安装这个私有包的文件路径是正确的:

RUN R -e "install.packages('C:/Users/<user>/Documents/<subfolder>/blah.tar.gz', repos = NULL, type = 'source')"

我已经在 Docker 之外测试了安装,据我所知,它应该可以工作。我错过了什么?

Dockerfile 运行s inside 构建映像中的命令,因此它无法访问主机文件系统中其他位置的文件。你可以:

  • 将文件复制到构建目录(构建上下文,你所在的目录运行 docker build

  • in Dockerfile: 将文件显式复制到图像中,然后R命令可能会到达图像内部的文件。

    # copy from the build context to the image:
    # <HOST_BUILD_DIR>/blah.tar.gz => <IMAGE_WORK_DIR>/blah.tar.gz
    COPY blah.tar.gz . 
    # R locates <IMAGE_WORK_DIR>/blah.tar.gz inside the image
    RUN R -e "install.packages('blah.tar.gz', repos = NULL, type = 'source')" 
    

一些参考资料:

问题不是我从中安装的 .tar.gz 源文件的路径目录;问题是我的私有包中有一个依赖项阻止了它的成功安装。我能够通过在我的应用程序脚本中插入 list.dirs()list.files() 来理解我的 docker 图像的文件结构,确认我的 .tar.gz 文件在我希望找到它的地方。

由于在 docker 文件中使用 RUN R -e "install.packages('blah.tar.gz', repos = NULL, type = 'source')" 如果软件包安装失败不会产生错误,我通过将安装片段 (install.packages("blah")) 插入到我的文件中找到了问题app 文件本身,代码给了我一个错误(我有一个 global.R 文件,其他人可能使用 app.R)。通过以这种方式安装包(虽然是暂时的),我能够查看代码输出并确切了解它失败的原因。我将新的依赖项添加到我的 docker 文件中,现在我的包可以从源安装而不会出错。