gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:10 26 4
gpt4 key购买 nike

我正在尝试安排 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 一起工作我会标记回答正确。

最佳答案

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

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

  2. 您的根容器是否具有 packrat.lock 文件的可执行权限?显然会阻止恢复运行。

将 docker 安装用户更改为 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/

关于Rscript 在容器中找不到已安装的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com