代码之家  ›  专栏  ›  技术社区  ›  Tom Greenwood

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

  •  1
  • Tom Greenwood  · 技术社区  · 7 年前

    我正在尝试计划和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"]
    

    它构建ok,然后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一起工作,我会将这个答案标记为正确。

    1 回复  |  直到 7 年前
        1
  •  1
  •   user3596968    7 年前

    根据问题和更新尝试以下几点:

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

    2. 你的根容器在packrat上有可执行的priv吗。锁定文件?显然会阻止恢复运行。

    将docker install user更改为rocker rstudio图像的默认“rstudio”,只移动packrat。锁和背包。选择文件

    USER rstudio
    COPY --chown=rstudio:rstudio packrat/packrat.* /home/project/packrat/
    

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

    推荐文章