【发布时间】: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 一起工作,我会标记回答正确。
【问题讨论】: