R Shiny Golem生成的Dockerfile构建报错:不存在‘remotes’包
问题根因
- 你的项目使用了renv做依赖管理,项目根目录下的
.Rprofile和renv相关文件被同步到容器的/build_zone目录后,R进程启动会自动激活renv隔离环境。该环境默认仅加载项目私有库内的包,不会继承你之前在系统全局R库安装的remotes等依赖,因此调用remotes::install_local时提示包不存在。 - 就算绕过remotes报错完成安装,renv默认会将你的
exampleApp包安装到/build_zone/renv/library路径下,后续执行rm -rf /build_zone时会将已安装的应用包一并删除,因此运行镜像时会提示包不存在。
修复方案
推荐优先使用禁用容器内renv加载的方案,镜像体积更小,逻辑更简单:
完整修改后的Dockerfile
FROM rocker/r-ver:4.1.1 RUN apt-get update && apt-get install -y git-core libcurl4-openssl-dev libgit2-dev libicu-dev libssl-dev libxml2-dev make pandoc pandoc-citeproc unixodbc-dev && rm -rf /var/lib/apt/lists/* RUN echo "options(repos = c(CRAN = 'http://cran.rstudio.com/'), download.file.method = 'libcurl', Ncpus = 4)" >> /usr/local/lib/R/etc/Rprofile.site RUN R -e 'install.packages("remotes")' RUN Rscript -e 'remotes::install_version("rlang",upgrade="never", version = "0.4.11")' RUN Rscript -e 'remotes::install_version("glue",upgrade="never", version = "1.4.2")' RUN mkdir /build_zone ADD . /build_zone WORKDIR /build_zone # 新增:删除renv激活相关文件,避免触发隔离环境 RUN rm -f .Rprofile renv.lock && rm -rf renv # 显式指定安装到系统全局R库,避免安装到临时路径 RUN R -e 'remotes::install_local(upgrade="never", lib = .Library)' RUN rm -rf /build_zone EXPOSE 3838 CMD R -e "options('shiny.port' = 3838,shiny.host='0.0.0.0');exampleApp::run_app()"
适配renv的备选方案
如果需要在容器内保留renv的依赖隔离能力,可调整构建逻辑:
- 激活renv后先安装remotes:
RUN R -e 'renv::install("remotes")' - 安装应用包后保留
/build_zone目录,不要执行删除操作 - 启动命令无需修改,renv会自动加载项目私有库内的应用包
内容的提问来源于stack exchange,提问作者Guy Brett-Robertson
相关产品推荐
相关产品推荐

