【问题标题】:Rscript not finding installed packages in containerRscript在容器中找不到已安装的软件包
【发布时间】:2019-06-08 18:21:27
【问题描述】:

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

# Install R version 3.5
FROM rocker/tidyverse:3.5.1

USER root

# Install Ubuntu packages
RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    xtail \
    wget \
    cron 



# Install R packrat, which we'll then use to install the other packages
RUN R -e 'install.packages("packrat", repos="http://cran.rstudio.com", dependencies=TRUE);'  


# copy packrat files
COPY  packrat/ /home/project/packrat/
# copy .Rprofile so that it know where to look for packages
COPY .Rprofile /home/project/
RUN R -e 'packrat::restore(project="/home/project");'

# Copy DB query script into the Docker image
COPY 002_query_db_for_kpis.R  /home/project/002_query_db_for_kpis.R
# copy crontab for db query
COPY db_query_cronjob /etc/crontabs/db_query_cronjob

# give execution rights
RUN chmod 644 /etc/crontabs/db_query_cronjob

# run the job
RUN crontab /etc/crontabs/db_query_cronjob


# start cron in the foreground 
CMD ["cron", "-f"]

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

docker exec -it   19338f50b4ed  Rscript `/home/project/002_query_db_for_kpis.R`

我得到的输出是:

Error in library(zoo) : there is no package called ‘zoo’
Execution halted

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

#!/usr/local/bin/env Rscript --default-packages=zoo,RcppRoll,lubridate,broom,magrittr,tidyverse,rlang,RPostgres,DBI

library(zoo)

...

所以,显然它没有找到包裹。他们虽然在那里。这就是 packrat 和复制 .Rprofile 的全部意义,它似乎可以工作,因为如果我在容器运行时在容器内运行 shell,我可以在其中找到它们:

root@d2b4f6e7eade:/usr/local/lib/R/site-library# 

而且所有的 packrat 文件似乎也都在正确的位置。难道 .Rprofile 文件没有被看到,因为它以 '.' 开头吗?我可以改变吗?

更新

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

【问题讨论】:

    标签: r linux docker rscript


    【解决方案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/
    

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

    【讨论】:

    • 感谢您的回答。但是,不要认为问题与 packrat 恢复软件包有关,因为我可以看到它是在 docker 构建期间安装的。问题在于 rscript 找不到它们。我认为这可能与脚本顶部的 #!/usr/local/bin/env Rscript 指向错误的位置有关,但我没有机会尝试更改因为其他东西已经进入大大地。再次感谢您的回复,一旦有机会,我会通知您。
    猜你喜欢
    • 2021-09-13
    • 2019-12-16
    • 2021-11-07
    • 2019-11-08
    • 2017-01-29
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多