Docker部署RShiny时指定R包未安装问题咨询
我编写了如下Dockerfile:
# Base image https://hub.docker.com/u/rocker/ FROM rocker/shiny:latest # system libraries of general use ## install debian packages 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 \ libproj-dev \ gdal-bin ## update system libraries RUN apt-get update && \ apt-get upgrade -y && \ apt-get clean RUN install2.r --error \ methods \ jsonlite \ tseries RUN R -e "install.packages(pkgs=c('shiny','leaflet','leaflet.providers','ggplot2','dplyr','shinythemes','ggspatial','googleCloudStorageR','sf','lubridate','googleAuthR','blastula','shinymanager','tiff','raster','scales','sp','RColorBrewer','anytime','rmarkdown','knitr','zip','evaluate','highr','methods','markdown','stringr','yaml','xfun','formatR','testit','digest','rgl','codetools','htmlwidgets','webshot','tikzDevice','tinytex','reticulate','JuliaCall','magick','png','jpeg','gifski','xml2','showtext','tibble','sass','bslib','tidyverse','bigrquery','DBI','glue','geojsonR','fst'), repos='https://cran.rstudio.com/',force=TRUE,dependencies=TRUE)" RUN mkdir /root/app COPY R /root/shiny_save EXPOSE 8080 # RUN dos2unix /usr/bin/shiny-server.sh && apt-get --purge remove -y dos2unix && rm -rf /var/lib/apt/lists/* CMD ["R", "-e", "shiny::runApp('/root/shiny_save', host='0.0.0.0', port=8080)"]unApp('/root/shiny_save', host='0.0.0.0', port=8080)"]
但运行Docker容器时,多个指定的R包并未安装,报错提示Error in library(xxx) : there is no package called 'xxx'(涉及shinymanager、ggspatial等包)。
我已确认所有包均存在于CRAN,且在Dockerfile中明确指定安装:
install.packages(pkgs=c('shiny','leaflet','leaflet.providers','ggplot2','dplyr','shinythemes','ggspatial','googleCloudStorageR','sf','lubridate','googleAuthR','blastula','shinymanager','tiff','raster','scales','sp','RColorBrewer','anytime','rmarkdown','knitr','zip','evaluate','highr','methods','markdown','stringr','yaml','xfun','formatR','testit','digest','rgl','codetools','htmlwidgets','webshot','tikzDevice','tinytex','reticulate','JuliaCall','magick','png','jpeg','gifski','xml2','showtext','tibble','sass','bslib','tidyverse','bigrquery','DBI','glue','geojsonR','fst'), repos='https://cran.rstudio.com/', force=TRUE)
我的应用目录(R)结构包含:app.R、global.R、server.R、ui.R等文件。
问题原因分析
Dockerfile语法错误
最后一行CMD指令存在明显语法错误,末尾多余了unApp('/root/shiny_save', host='0.0.0.0', port=8080)"]内容,导致容器启动命令无效,同时可能掩盖安装过程中的异常。R包安装未设置错误终止机制
使用R -e "install.packages(...)"时,即使部分包安装失败,R默认不会返回非零退出码,Docker会判定该RUN指令执行成功并继续构建流程,最终容器中缺少未安装成功的包。而你用install2.r时添加了--error参数会在安装失败时终止构建,但install.packages没有配置类似的强制错误终止规则。系统库依赖缺失或冲突
部分R包需要特定系统库支持,比如magick依赖libmagick++-dev、sf依赖libgeos-dev,你当前安装的系统库存在遗漏;另外执行apt-get upgrade -y可能升级了rocker/shiny镜像原生系统库,导致与R包依赖的库版本不兼容,引发安装失败。批量安装的依赖解析问题
一次性安装大量包时,R的依赖解析可能出现异常,部分包的间接依赖未被正确安装,导致主包安装失败;同时重复安装methods包也可能引发不必要的冲突。
内容的提问来源于stack exchange,提问作者Leprechault

