Docker化R(Shiny)应用启动报错:找不到shiny包,请求排查问题
问题
尝试将R(Shiny)应用Docker化时遇到报错,Dockerfile内容如下:
FROM rocker/shiny:latest RUN apt-get update -qq && apt-get -y --no-install-recommends install \ libxml2-dev \ libcairo2-dev \ libsqlite3-dev \ libmariadbd-dev \ libpq-dev \ libssh2-1-dev \ unixodbc-dev \ libcurl4-openssl-dev \ libssl-dev && rm -rf /var/lib/apt/lists/* ## update system libraries RUN apt-get update && \ apt-get upgrade -y && \ apt-get clean # python dependencies RUN apt-get install -y python3-pip RUN pip3 install tensorflow==2.10.0 ## working directory WORKDIR /app # install renv and restore packages RUN Rscript -e 'install.packages("renv")' COPY renv.lock . RUN Rscript -e 'renv::restore()' # copy the app to the image COPY . . # expose port EXPOSE 3838 # run app on container start CMD ["Rscript", "-e", "shiny::runApp('/app', host = '0.0.0.0', port = 3838)"]
执行启动命令时出现以下错误:
# Bootstrapping renv 1.0.2 --------------------------------------------------- - Downloading renv ... OK - Installing renv ... OK - One or more packages recorded in the lockfile are not installed. - Use `renv::status()` for more details. Error in loadNamespace(x) : there is no package called ‘shiny’ Calls: loadNamespace -> withRestarts -> withOneRestart -> doWithOneRestart Execution halted
不清楚哪里操作出错,求排查。
解决思路
问题根源
rocker/shiny基础镜像本身预装了shiny,但renv创建的隔离环境默认不会包含系统级安装的包。启动时renv接管了包加载路径,导致找不到基础镜像里的shiny;同时你的renv.lock文件未记录shiny依赖,所以renv::restore()也不会自动安装它。
修复方案
将shiny加入renv依赖锁文件
在本地开发环境中运行renv::snapshot(),把shiny添加到项目的renv.lock中,这样容器执行renv::restore()时会自动安装shiny到隔离环境。优化Dockerfile执行逻辑
- 合并重复的
apt-get update命令,减少镜像层数、提升构建速度:RUN apt-get update -qq && apt-get -y --no-install-recommends install \ libxml2-dev \ libcairo2-dev \ libsqlite3-dev \ libmariadbd-dev \ libpq-dev \ libssh2-1-dev \ unixodbc-dev \ libcurl4-openssl-dev \ libssl-dev \ python3-pip && \ apt-get upgrade -y && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* - 改用
R命令启动应用,确保renv环境被正确加载:CMD ["R", "-e", "shiny::runApp('/app', host = '0.0.0.0', port = 3838)"]
- 合并重复的
让renv复用系统预装的shiny(可选)
如果不想在renv环境中重复安装shiny,可在项目根目录创建.Rprofile文件,添加:options(renv.config.snapshot.installed = TRUE)或者在本地运行
renv::settings$ignored.packages(NULL),取消renv对系统级包的忽略,再执行renv::snapshot()更新锁文件。
内容的提问来源于stack exchange,提问作者se7en
相关产品推荐
相关产品推荐

