我无法在docker中加载sf

问题描述 投票:0回答:1

我正在部署一个完全依赖于

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 docker gdal
1个回答
0
投票

当您想要将 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')"

备注:

  1. 是否加入之前的
    apt
    install.packages(..)
    命令取决于您。
  2. 我鼓励您查看 https://docs.docker.com/develop/develop-images/instructions/ 了解“最佳实践”,尤其是在安装操作系统级软件包时,尝试平衡其与图像大小(因此
    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
© www.soinside.com 2019 - 2024. All rights reserved.