【问题标题】:How to prevent packrat installs packages in system's library inside docker?如何防止packrat在docker内的系统库中安装包?
【发布时间】:2019-04-25 14:42:46
【问题描述】:

我有一个使用 Packrat 的闪亮项目。当我创建一个 Rocker-shiny Docker 容器时,我将命令放入 Dockerfile 以安装 packrat 包和恢复库。但是,我看到 packrat 将包安装到系统库(/usr/local/lib/R/...)而不是私有项目库中。如果我进入 bash docker 的控制台并在项目目录中启动 R 会话,然后读取 .Rprofile 文件并安装 packrat 并开始将包安装到私有库中。我如何从 Dockerfile 中获取此信息?

在我的 Dockerfile 中:

RUN cd /srv/shiny-server && \ R -e 'install.packages("packrat" , repos="http://cran.us.r-project.org"); packrat::restore()'

将软件包安装到 /usr/local/lib/R... 出了什么问题。

但是,如果我进入 docker bash 并在我的项目目录中启动一个 R 会话,它工作正常:

docker exec -it test_app bash
cd /srv/shiny-server
R # start R session into project dir
Packrat is not installed in the local library -- attempting to bootstrap an installation...
> Installing packrat into project private library:
- "/srv/shiny-server/packrat/lib/x86_64-pc-linux-gnu/3.5.3"
* installing *source* package ‘packrat’ ...
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (packrat)
> Attaching packrat
> Restoring library
Installing plyr (1.8.1) ... OK (built source)

【问题讨论】:

  • 如果你的项目是 dockerised,安装东西到系统库有什么问题?
  • 我不知道原因,但它没有将 packrat.lock 文件中的所有软件包安装到系统库中。例如,在创建 docker 容器时,我看到所有包是如何构建和安装的,但随后一些包丢失并且我的应用程序崩溃了。
  • 要建立在@KonradRudolph 的评论上,通常你确实想将东西安装到你的Dockerfile中的“系统”路径中:它在设置环境时省去了很多麻烦变量和备用路径。

标签: r linux docker


【解决方案1】:

我遇到了同样的问题,并通过在我的 docker-compose 文件中恢复 packrat 包解决了这个问题:

docker-compose.yml:

...
command: [sh,-c, "sudo Rscript config/packrat_restore.R"]
...

packrat_restore.R:

packrat::init(
  infer.dependencies = FALSE,
  enter = TRUE,
  restart = FALSE)
packrat::restore()

由于这种解决方法总是会延迟我的容器在生产中的启动,我仍然会尝试修复 Dockerfile 本身的问题...

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2017-08-02
    • 2018-05-13
    相关资源
    最近更新 更多