Docker中安装Rcpp包时进程冻结的问题求助
解决R Shiny Docker构建卡在Rcpp编译的问题
我之前也碰到过几乎一模一样的情况!你的构建卡在Rcpp源码编译环节,既不是Rcpp本身的问题,也不是Docker的核心bug,主要是两个细节导致的:一是源码编译R包太耗资源,Docker默认分配的资源不够;二是你的Dockerfile用了源码安装多个依赖包,触发了大量底层编译操作。
下面是几个亲测有效的解决方案,按优先级排序:
1. 改用二进制R包安装(最推荐)
源码编译Rcpp这类依赖C++的包非常吃CPU和内存,很容易在资源有限的环境下卡住。换成二进制包安装可以直接跳过编译步骤,速度快很多,也不会卡住。
修改你的Dockerfile,添加CRAN的二进制源,然后用apt-get直接安装预编译好的R包:
FROM openanalytics/r-base # 添加CRAN官方二进制包源(适配Debian Buster/R 4.0.x) RUN echo "deb https://cloud.r-project.org/bin/linux/debian buster-cran40/" >> /etc/apt/sources.list && \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 && \ # 合并所有系统依赖和R包安装,减少镜像分层 apt-get update && apt-get install -y --no-install-recommends \ sudo \ pandoc \ pandoc-citeproc \ libcurl4-gnutls-dev \ libcairo2-dev \ libxt-dev \ libssl-dev \ libssh2-1-dev \ libxml2-dev \ # 直接安装二进制R包,无需源码编译 r-cran-data.table \ r-cran-janitor \ r-cran-snakecase \ r-cran-dplyr \ r-cran-shiny && \ # 清理apt缓存,减小镜像体积 rm -rf /var/lib/apt/lists/* # 复制应用文件 RUN mkdir /root/corona COPY app /root/corona COPY Rprofile.site /usr/lib/R/etc/ EXPOSE 3838 # 修正CMD的引号格式,避免解析错误 CMD ["R", "-e", "shiny::runApp('/root/corona', options = list(port = 3838))"]
2. 给Docker分配更多资源
如果你一定要坚持源码安装(比如需要特定旧版本的包),那首先要检查Docker的资源分配:
- 打开Docker Desktop的设置,把CPU核心数调到4个以上,内存分配到4GB以上
- 构建时可以加上
--cpus 4 --memory 4g参数强制分配资源:docker build --cpus 4 --memory 4g -t shiny-app .
资源充足后,Rcpp的编译就能顺利完成。
3. 优化原Dockerfile的细节
如果不想换二进制源,也可以优化原Dockerfile的写法,减少不必要的编译触发:
- 合并所有
RUN R -e命令成一个,避免重复初始化R环境 - 移除不必要的
libssl1.0.0依赖(libssl-dev已经包含了所需的库) - 给
install.packages加上Ncpus = parallel::detectCores()参数,启用多线程编译:RUN R -e "install.packages(c('data.table','janitor','snakecase','Rcpp'), repos='https://cloud.r-project.org/', Ncpus = parallel::detectCores())"
内容的提问来源于stack exchange,提问作者Data Mastery
相关产品推荐
相关产品推荐

