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

问题描述 投票:1回答:1

我正在尝试安排和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文件没有被看到,因为它以'。'开头?我可以改变吗?

UPDATE

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

r linux docker rscript
1个回答
1
投票

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

  1. 你有没有忽略你的.dockerignore中的packrat / lib *和packrat / src /目录?我担心你正在复制所有构建的软件包,因此restore()认为已经在容器中构建了软件包。
  2. 你的root容器在packrat.lock文件中有可执行的priv吗?显然会阻止恢复运行。

将docker安装用户更改为摇杆rstudio image的默认“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/

© www.soinside.com 2019 - 2024. All rights reserved.