我试图安排和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一起使用,我会标记为回答正确。

最佳答案

根据问题尝试一些事情并进行更新:

  • 您是否忽略了.dockerignore中的packrat/lib *和packrat/src/目录?我担心您正在复制所有已构建的软件包,因此restore()认为这些软件包已在您的容器中构建。
  • 您的根容器在packrat.lock文件上是否具有可执行privs?显然会阻止还原运行。

  • 将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/

    10-08 01:44