我正在尝试在 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 建议的其他替代方案:
从 apt 安装并使用系统 R,它将开箱即用地安装 udunits2。(我没有这样做,因为我认为这会使 jupyternotebook 变得复杂,但我没有检查……)
使用不同的 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 安装方法将是一个不错的解决方案。