我正在部署一个完全依赖于
sf
的应用程序(在 docker 上),但我在将其加载到 docker 时遇到问题:
FROM rocker/shiny
#Make a directory in the container
RUN mkdir /home/shiny-app
RUN R -e "install.packages('sf')"
RUN R -e "library('sf')"
COPY . /home/shiny-app/
这是我收到的错误消息。我不知道是什么导致了这个错误。大概是GDAL吧? 我需要帮助来解决这个问题。
当您想要将 R 软件包添加到运行 R 的新操作系统时,您需要了解所需的任何底层操作系统软件包。在这种情况下,阅读
sf
的 DESCRIPTION
,我们看到
SystemRequirements: GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3
如何知道这些标签的含义并不总是直观的。您可能会在 Posit 的 Package Manager 上寻找有关此问题的提示,其中列出了 Ubuntu 22.04 上的以下操作系统要求(
rocker/shiny
基于此)。
apt-get install -y libgdal-dev
apt-get install -y gdal-bin
apt-get install -y libgeos-dev
apt-get install -y libproj-dev
apt-get install -y libsqlite3-dev
apt-get install -y libssl-dev
apt-get install -y libudunits2-dev
其中许多可能已经存在。
首先,让我重现一下问题:
$ docker built -t quux .
$ docker run -it --rm quux R --quiet
> library("sf")
Error: package or namespace load failed for ‘sf’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/usr/local/lib/R/site-library/units/libs/units.so':
libudunits2.so.0: cannot open shared object file: No such file or directory
根据经验,我知道 Jammy (22.04) 需要 R 的
sf
包中的这些包,请将这些行添加到您的 Dockerfile
中的某个位置:
# ...
RUN apt-get update && \
apt-get install -y libproj22 libudunits2-0 libgdal30 && \
rm -rf /var/lib/apt/lists/*
RUN R -e "install.packages('sf')"
备注:
apt
和 install.packages(..)
命令取决于您。rm -rf
命令)。现在可以使用了:
$ docker built -t quux .
$ docker run -it --rm quux R --quiet
> library("sf")
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE