Rscript не находит установленные пакеты в контейнере - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь запланировать и запустить скрипт 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)

...

Итак, очевидно, что он не находит пакеты. Они там, хотя. В этом и заключался весь смысл упаковать и скопировать .Rprofile, и, похоже, это сработало, потому что, если я запускаю оболочку внутри контейнера во время его работы, я могу найти их в:

root@d2b4f6e7eade:/usr/local/lib/R/site-library# 

и все файлы packrat также выглядят в нужном месте ... может ли быть так, что файл .Rprofile не виден, потому что он начинается с '.'? Могу ли я это изменить?

ОБНОВЛЕНИЕ

Если я не использую packrat, но устанавливаю пакеты нормально, это работает. Покопавшись в файлах контейнера, я вижу, что / usr / local / lib / R / site-library не содержит необходимых пакетов, а / home / project / packrat / src. Таким образом, это должно быть связано с тем, что Rscript выглядит не в том месте. Я думал, что .Rprofile в / home / project решит это, но это не так ... может быть, что-то еще, что я не скопировал? Хотя у меня сейчас запущен скрипт, он не идеален, так как эти пакеты могут быть разных версий (поэтому я и хочу использовать packrat), поэтому, если кто-нибудь сможет выяснить, как заставить его работать с packrat, я отмечу, что ответь правильно.

1 Ответ

0 голосов
/ 14 февраля 2019

Несколько вещей, которые нужно попробовать, основываясь на проблеме и обновлении:

  1. игнорировали ли вы свои каталоги packrat / lib * и packrat / src / в .dockerignore? Я беспокоюсь, что вы копируете все созданные пакеты, и поэтому restore () считает, что пакеты уже встроены в ваш контейнер.

  2. есть ли в вашем корневом контейнере исполняемый файл privs в файле packrat.lock? очевидно, помешает запуску восстановления.

изменить пользователя установки докера на стандартную "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/

...