无法 dockerize 一个 RStudio Shiny 项目,包 rgdal 出错

问题描述

我正在尝试 dockerize 一个闪亮的项目,但在运行 docker 镜像时遇到错误

Error: package or namespace load Failed for ‘rgdal’ in dyn.load(file,DLLpath = DLLpath,...):
 unable to load shared object '/usr/local/lib/R/site-library/rgdal/libs/rgdal.so':
  libgdal.so.26: cannot open shared object file: No such file or directory

对于上下文,我的文件结构如下:

.
├── shiny-app
│   ├── App.R
│   └── data
├── .gitignore
├── Dockerfile
├── README.md
└── my-project.Rproj

我的闪亮应用程序具有以下库依赖项:

library(shiny)
library(shinythemes)
library(textdata)
library(tidyverse)
library(leaflet)
library(rgdal)
library(viridis)

(我知道我可以通过仅选择我正在使用的 tidyverse 中的包来大胆地缩小依赖项的大小,但这是以后的问题)。

最后,我的 Dockerfile 包含以下命令:

# get shiny server and R from the rocker project
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

## update system libraries
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get clean
  

# copy necessary files
## app folder
copY /shiny-app ./app

# install R packages required 
RUN R -e 'install.packages(c(\
              "shiny",\
              "shinythemes",\
              "textdata",\
              "tidyverse",\
              "rgdal",\
              "leaflet",\
              "viridis",\
            ),\
            repos="https://packagemanager.rstudio.com/cran/__linux__/focal/2021-04-23"\
          )'


# run app on container start
CMD ["R","-e","shiny::runApp('/app')"]

我可以使用 docker build -t my-app . 构建映像。但是,当我尝试运行 docker 映像时,我收到了上面提到的错误。最奇怪的部分是可以加载闪亮的、tidyverse 和其他包。我不知道为什么 docker 无法访问和使用已安装的 rgdal 包,如果它可以访问其他包。

很想听听任何想法!谢谢!

解决方法

rgdal 需要在 Linux 中安装以下内容:

libgdal-dev libproj-dev

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...