我正在部署一个完全依赖于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? 我需要帮助来解决这个问题.

enter image description here

推荐答案

当您想将R包添加到运行R的新操作系统时,您需要了解所需的任何底层操作系统包.在这种情况下,读sfDESCRIPTION,我们看到

SystemRequirements: GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3

如何了解这些标签的含义并不总是直观的.您可能会在Posit's 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 build -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. 是否加入之前的aptinstall.packages(..)命令由你决定.
  2. 我鼓励您查看https://docs.docker.com/develop/develop-images/instructions/中的"最佳实践",特别是在安装操作系统级别的软件包时,试图与镜像大小进行平衡(因此使用rm -rf命令).

它现在起作用:

$ docker build -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

R相关问答推荐

使用sensemakr和fixest feols模型(R)

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

如何删除R中除某些特定名称外的所有字符串?

根据R中两个变量的两个条件删除带有dspirr的行

在使用ggroove后,将图例合并在gplot中

Ggplot2中的重复注记

如何写商,水平线,在一个单元格的表在R

如何将网站图像添加到带有极坐标的面包裹条形图?

警告消息";没有非缺失的参数到min;,正在返回数据中的inf";.表分组集

为什么我对圆周率图的蒙特卡罗估计是空的?

解析嵌套程度极高的地理数据

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

在ggploy中创建GeV分布时出错

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

在同一单元格中创建包含整数和百分比的交叉表

从字符串01JAN2021创建日期

将字符变量出现次数不相等的字符框整形为pivot_wider,而不删除重复名称或嵌套字符变量

为什么R列名称忽略具有指定名称的向量,而只关注索引?

删除r中每个因素级别的最后2行

R中的交叉表