#r #docker #shiny #r-package #shinyproxy
Вопрос:
В настоящее время я пытаюсь запустить свое r-приложение через shinyproxy в сочетании с докером — к сожалению, безуспешно.
Приложение работает без проблем при запуске через R-Studio. Однако, как только я создаю образ докера и пытаюсь вызвать его, я получаю сообщение об ошибке «функция %>% не найдена>«.
Я думаю, что пакеты загружены неправильно, но я не могу сказать, почему. В моем файле настройки я ссылаюсь на «installLibrarys.Файл R», который содержит все библиотеки, необходимые мне для приложения. Я также адаптировал файл rProfile, чтобы каждый сеанс R загружал все библиотеки.
С аналогичным приложением, которое было менее обширным (но с почти идентичным dockerfile, а также applications.yml), хостинг через shinyproxy и docker работал без каких-либо проблем….
да, Вы можете найти мой файл Docker, мой Rprofile.site, мое приложение.yml и мои installLibrarys.R в конце поста.
Может быть, у кого-то есть идея, что еще я мог бы сделать. Если вам нужна дополнительная информация, не стесняйтесь обращаться ко мне! 🙂
Спасибо вам и с наилучшими пожеланиями
P.S.: Я знаю, что многие библиотеки «содержатся» в других и загружаются без необходимости — я еще не дошел до сортировки 😀
Rprofile.сайт
## Emacs please make this -*- R -*-
## empty Rprofile.site for R on Debian
##
## Copyright (C) 2008 - 2018 Dirk Eddelbuettel and GPL'ed
##
## see help(Startup) for documentation on ~/.Rprofile and Rprofile.site
# ## Example of .Rprofile
# options(width=65, digits=5)
# options(show.signif.stars=FALSE)
# setHook(packageEvent("grDevices", "onLoad"),
# function(...) grDevices::ps.options(horizontal=FALSE))
# set.seed(1234)
# .First <- function() cat("n Welcome to R!nn")
# .Last <- function() cat("n Goodbye!nn")
# ## Example of Rprofile.site
# local({
# # add MASS to the default packages, set a CRAN mirror
# old <- getOption("defaultPackages"); r <- getOption("repos")
# r["CRAN"] <- "http://my.local.cran"
# options(defaultPackages = c(old, "MASS"), repos = r)
#})
## We set the cloud mirror, which is 'network-close' to everybody, as default
local({
r <- getOption("repos")
r["CRAN"] <- "https://cloud.r-project.org"
options(repos = r)
})
library("shiny")
library("rwhatsapp")
library("dplyr")
library("stringr")
library("grid")
library("gridExtra")
library("cowplot")
library("magick")
library("ggmap")
library("stopwords")
library("tidytext")
library("stringi")
library("ggplot2")
library("tidyr")
library("lubridate")
library("ggtext")
library("lattice")
library("extrafont")
library("showtext")
library("ggfittext")
library("sysfonts")
library("png")
library("shinyBS")
library("shinyWidgets")
library("bslib")
library("shinycustomloader")
library("magrittr")
library("knitr")
Установочные пакеты.R
r = getOption("repos")
r["CRAN"] = "http://cran.us.r-project.org"
options(repos = r)
install.packages("shiny")
install.packages("rwhatsapp")
install.packages("dplyr")
install.packages("stringr")
install.packages("grid")
install.packages("gridExtra")
install.packages("cowplot")
install.packages("magick")
install.packages("ggmap")
install.packages("stopwords")
install.packages("tidytext")
install.packages("stringi")
install.packages("ggplot2")
install.packages("tidyr")
install.packages("lubridate")
install.packages("ggtext")
install.packages("lattice")
install.packages("extrafont")
install.packages("showtext")
install.packages("ggfittext")
install.packages("sysfonts")
install.packages("png")
install.packages("googleway")
install.packages("shinyBS")
install.packages("shinyWidgets")
install.packages("bslib")
install.packages("shinycustomloader")
library(shiny)
library(rwhatsapp)
library(dplyr)
library(stringr)
library(grid)
library(gridExtra)
library(cowplot)
library(magick)
library(ggmap)
library(stopwords)
library(tidytext)
library(stringi)
library(ggplot2)
library(tidyr)
library(lubridate)
library(ggtext)
library(lattice)
library(extrafont)
library(showtext)
library(ggfittext)
library(sysfonts)
library(png)
library(googleway)
library(shinyBS)
library(shinyWidgets)
library(bslib)
library(shinycustomloader)
Dockerfile
FROM rocker/r-base:latest
LABEL maintainer="USER <user@example.com>"
RUN apt-get update amp;amp; apt-get install -y --no-install-recommends
sudo
libcurl4-gnutls-dev
libgtk2.0-dev
xvfb
xauth
xfonts-base
libcairo2-dev
libxt-dev
libssl-dev
libssh2-1-dev
libxml2-dev
libmagick -dev
amp;amp; rm -rf /var/lib/apt/lists/*
RUN install.r shiny
RUN echo "local(options(shiny.port = 3838, shiny.host = '0.0.0.0'))" > /usr/lib/R/etc/Rprofile.site
RUN addgroup --system app
amp;amp; adduser --system --ingroup app app
WORKDIR /home/app
COPY app .
RUN Rscript installPackages.R
RUN chown app:app -R /home/app
USER app
EXPOSE 3838
CMD ["R", "-e", "shiny::runApp('/home/app')"]
приложение.yml
proxy:
title: ShinyProxy
# logo-url: https://link/to/your/logo.png
landing-page: /
favicon-path: favicon.ico
heartbeat-rate: 10000
heartbeat-timeout: 600000
port: 8080
container-wait-time: 60000
admin-groups: admins
hide-navbar: true
# Docker configuration
docker:
cert-path: /home/none
url: http://localhost:2375
port-range-start: 20000
specs:
- id: 01_hello
display-name: Hello Shiny App
description: A simple reactive histogram
container-image: #######:latest
logo-url: ########
access-groups: [admins, users]
logging:
file:
shinyproxy.log
spring:
servlet:
multipart:
max-file-size: 2000MB
max-request-size: 2000MB
Комментарии:
1. Как выглядит код для вашего блестящего приложения? Есть ли у вашего блестящего кода
library(dpyr)
? Или вы пытаетесь избежать этого сRprofile.site
помощью файла? Я не совсем понимаю, где вы на самом деле это используете. Потому что в вашем файле dockerfile у вас естьRUN echo "local(options(shiny.port = 3838, shiny.host = '0.0.0.0'))" > /usr/lib/R/etc/Rprofile.site
то, что вообще не связано с этим другим файлом. Вы имели в виду включить этот файл куда-нибудь в файл dockerfile?2. @MrFlick я только что погуглил свою проблему, и кто-то дал совет добавить библиотеки в Rprofile. итак, я попробовал :Я думаю, что библиотеки дополнительно загружаются в приложение — может ли это быть причиной?
3. Но на самом деле вы нигде не использовали этот файл. Так что на самом деле ты этого не делал. Ваш файл dockerfile не использует этот файл, он создает его с помощью оператора echo. Вы могли бы это исправить, но, как правило, лучше явно указывать зависимости вашей библиотеки в самом коде приложения. Но вы не предоставили ни одного из этих кодов, поэтому неясно, что там происходит.
4. @MrFlick мое приложение состоит из относительно большого количества файлов, каждый из которых ссылается на себя — было бы сложно загрузить все данные. Но вы бы рекомендовали загружать библиотеки непосредственно в код вместо использования installLibrarys? Файл R?
5.Установка пакетов-это одно, не стесняйтесь сохранять это. Однако среда, в которой выполняется этот сценарий, отбрасывается к моменту завершения создания образа, поэтому любые
library(XX)
вызовы в этом сценарии являются недолговечными. Если вашему приложению нужен пакет, используйте егоlibrary(XX)
в самом приложении; часто я вижуglobal.R
файл, в котором есть всеlibrary(XX)
вызовы, и другие файлыsource(.)
, которые необходимы.
Ответ №1:
Я нашел решение.
Я загрузил все библиотеки один раз в начале ui.r
файла — не через функцию, а напрямую. Это не делает код приятнее, но он работает 😀