Rscript 在容器中找不到已安装的软件包

Tom*_*ood 5 linux r rscript docker

我正在尝试安排 R 脚本在容器内运行。我有一个像这样的 docker 文件:

\n\n
# Install R version 3.5\nFROM rocker/tidyverse:3.5.1\n\nUSER root\n\n# Install Ubuntu packages\nRUN apt-get update && apt-get install -y \\\n    sudo \\\n    gdebi-core \\\n    pandoc \\\n    pandoc-citeproc \\\n    libcurl4-gnutls-dev \\\n    libcairo2-dev \\\n    libxt-dev \\\n    libssl-dev \\\n    xtail \\\n    wget \\\n    cron \n\n\n\n# Install R packrat, which we\'ll then use to install the other packages\nRUN R -e \'install.packages("packrat", repos="http://cran.rstudio.com", dependencies=TRUE);\'  \n\n\n# copy packrat files\nCOPY  packrat/ /home/project/packrat/\n# copy .Rprofile so that it know where to look for packages\nCOPY .Rprofile /home/project/\nRUN R -e \'packrat::restore(project="/home/project");\'\n\n# Copy DB query script into the Docker image\nCOPY 002_query_db_for_kpis.R  /home/project/002_query_db_for_kpis.R\n# copy crontab for db query\nCOPY db_query_cronjob /etc/crontabs/db_query_cronjob\n\n# give execution rights\nRUN chmod 644 /etc/crontabs/db_query_cronjob\n\n# run the job\nRUN crontab /etc/crontabs/db_query_cronjob\n\n\n# start cron in the foreground \nCMD ["cron", "-f"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

它构建正常,然后 cron 作业默默失败。当我调查时:

\n\n
docker exec -it   19338f50b4ed  Rscript `/home/project/002_query_db_for_kpis.R`\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到的输出是:

\n\n
Error in library(zoo) : there is no package called \xe2\x80\x98zoo\xe2\x80\x99\nExecution halted\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,脚本的第一部分如下所示:

\n\n
#!/usr/local/bin/env Rscript --default-packages=zoo,RcppRoll,lubridate,broom,magrittr,tidyverse,rlang,RPostgres,DBI\n\nlibrary(zoo)\n
Run Code Online (Sandbox Code Playgroud)\n\n

...

\n\n

所以,很明显它没有找到包。但他们就在那里。这就是 packrat 和复制 .Rprofile 的全部要点,它似乎有效,因为如果我在容器运行时在容器内运行 shell,我可以在以下位置找到它们:

\n\n
root@d2b4f6e7eade:/usr/local/lib/R/site-library# \n
Run Code Online (Sandbox Code Playgroud)\n\n

并且所有 Packrat 文件似乎也都在正确的位置.. 是否可能没有看到 .Rprofile 文件,因为它以 \'.\' 开头?我可以改变这一点吗?

\n\n

更新

\n\n

如果我不使用 packrat,但正常安装软件包,它就可以工作。深入容器的文件内部,我可以看到 /usr/local/lib/R/site-library 中没有所需的包,而 /home/project/packrat/src 中有。所以,这一定是 Rscript 找错了地方。我认为 /home/project 中的 .Rprofile 可以解决这个问题,但它没有..也许还有其他我没有复制的东西?虽然我现在已经运行了脚本,但它并不理想,因为这些包可能是不同的版本(这就是为什么我想使用 Packrat),所以如果有人能弄清楚如何让它与 Packrat 一起工作,我\ 会将该答案标记为正确。

\n

小智 1

根据问题和更新尝试一些事情:

  1. 您是否忽略了 .dockerignore 中的 packrat/lib* 和 packrat/src/ 目录?我担心您正在复制所有构建的包,因此 Restore() 认为这些包已经构建在您的容器中。

  2. 您的根容器在 packrat.lock 文件上是否有可执行权限?显然会阻止恢复运行。

将 docker install 用户更改为 rocker rstudio 映像的默认“rstudio”,仅移动 packrat.lock 和 packrat.opts 文件

USER rstudio
COPY --chown=rstudio:rstudio packrat/packrat.* /home/project/packrat/
Run Code Online (Sandbox Code Playgroud)

这些选项的一个很好的参考:https://rviews.rstudio.com/2018/01/18/package-management-for-reproducible-r-code/