Docker 镜像中 udunits2 包安装

Docker 镜像中 udunits2 包安装

我正在尝试在 Docker 映像中安装 R 包 udunits2/units

FROM jupyter/datascience-notebook:abdb27a6dfbb

USER root

RUN sudo apt-get update
RUN sudo apt-get install -y libudunits2-dev
RUN Rscript -e "install.packages('udunits2', configure.args=c('--with-udunits2-lib=/usr/lib/x86_64-linux-gnu', '--with-udunits2-include=/usr/include'), repos='http://cran.us.r-project.org/')"

虽然看起来已经安装了 libudunits-2.0,但是 R 中的 udunits2 安装过程似乎无法使用它。

checking udunits2.h usability... no
checking udunits2.h presence... yes
checking for udunits2.h... no
checking for ut_read_xml in -ludunits2... no
-----Error: libudunits2.a not found-----
     If the udunits2 library is installed in a non-standard location,
     use --configure-args='--with-udunits2-lib=/usr/local/lib' for example,
     or --configure-args='--with-udunits2-include=/usr/include/udunits2'
     replacing paths with appropriate values for your installation.
     You can alternatively use the UDUNITS2_INCLUDE and UDUNITS2_LIB
     environment variables.
     If udunits2 is not installed, please install it.
     It is required for this package.

我确认文件确实位于我定义的位置:

Step 5/8 : RUN find /usr -name libudunits2.so
/usr/lib/x86_64-linux-gnu/libudunits2.so
Step 6/8 : RUN find /usr -name libudunits2.a
/usr/lib/x86_64-linux-gnu/libudunits2.a
Step 7/8 : RUN find /usr -name udunits2.h
/usr/include/udunits2.h

我尝试了几种不同的组合来添加标志来告诉安装应该在哪里(根据下面的线程),或者安装非开发版本,有时错误消息看起来有点不同:

configure: error: in `/tmp/RtmpiIvCWu/R.INSTALLbd0423c2d28/units':
configure: error: 
--------------------------------------------------------------------------------
  Configuration failed because libudunits2.so was not found. Try installing:
    * deb: libudunits2-dev (Debian, Ubuntu, ...)
    * rpm: udunits2-devel (Fedora, EPEL, ...)
    * brew: udunits (OSX)
  If udunits2 is already installed in a non-standard location, use:
    --configure-args='--with-udunits2-lib=/usr/local/lib'
  if the library was not found, and/or:
    --configure-args='--with-udunits2-include=/usr/include/udunits2'
  if the header was not found, replacing paths with appropriate values.
  You can alternatively set UDUNITS2_INCLUDE and UDUNITS2_LIBS manually.
--------------------------------------------------------------------------------

其他人也遇到过这个问题,但到目前为止还没有人安装到Docker中:

https://stackoverflow.com/questions/51955352/udunits2-h-not-found-when-installing-units-r-package

https://stackoverflow.com/questions/47059517/how-install-r-package-udunits2-in-ubuntu

https://stackoverflow.com/questions/50362201/udunits2-r-install-udunits2-h-not-found

https://stackoverflow.com/questions/42287164/install-udunits2-package-for-r3-3

有什么想法吗?非常感谢!

答案1

以下解决方案是 udunits2 软件包作者 Hiebert 提出的一种解决方法的摘要(https://superuser.com/users/1052048/hiebert),由于这里的一些垃圾邮件过滤器过于活跃,他无法发布他的解决方案...所以所有的功劳都归功于他,非常感谢你的帮助,Hiebert!

我先从 jupyternotebooks 提供的 docker 镜像开始(jupyter/datascience-notebook:abdb27a6dfbb)。恰巧,这个镜像中已经通过 Anaconda 安装了 R,而且 anaconda 已经用自己的编译器替换了普通的 gcc 编译器

checking for gcc... x86_64-conda_cos6-linux-gnu-cc

由于某种原因,anaconda 编译器拒绝编译该包。但是,普通的 gcc 编译器可以正常工作。因此,一种解决方案是更改编译器(https://stackoverflow.com/questions/1616983/building-r-packages-using-alternate-gcc

因此,虽然解决方案有点“感觉不对”,但这正是我所做的。我从镜像 (/opt/conda/lib/R/etc/Makeconf) 复制了 Makeconf 文件,更改了第 15 行以将 gcc 指定为 c 编译器。

root@4db3ae045abb:/opt/conda/lib/R/etc# diff Makeconf.old Makeconf
15c15
< CC = x86_64-conda_cos6-linux-gnu-cc
---
> CC = gcc

然后,在构建我的 docker 镜像时,我备份了原始 Makeconf 文件,将其复制到目录中,安装了包,然后恢复了原始 Makeconf 文件:

RUN mv /opt/conda/lib/R/etc/Makeconf /opt/conda/lib/R/etc/Makeconf.old
COPY Makeconf /opt/conda/lib/R/etc/Makeconf
RUN Rscript -e "install.packages('udunits2', repos='http://cran.us.r-project.org/')"
RUN mv /opt/conda/lib/R/etc/Makeconf.old /opt/conda/lib/R/etc/Makeconf

我确信在命令行中有更优雅的方法可以做到这一点,但我是个新手;)

Hiebert 建议的其他替代方案:

  1. 从 apt 安装并使用系统 R,它将开箱即用地安装 udunits2。(我没有这样做,因为我认为这会使 jupyternotebook 变得复杂,但我没有检查……)

  2. 使用不同的 Docker 基础镜像,例如官方的 r-base Docker 镜像,它也将安装开箱即用的 udunits2。(我也没有尝试这个,因为我想要 jupyter notebook)

就是这样!希望这对大家有帮助 :)

答案2

如果您正在使用 datascience-notebook,可以使用 conda 安装,这可能是最简单的方法。运行 conda install -c conda-forge udunits2

请参阅此网站https://anaconda.org/conda-forge/udunits2了解其他选项。您还可以从此站点搜索其他 r 包。如果您遇到 cmake 或 gcc 问题,conda 安装方法将是一个不错的解决方案。

相关内容