web-dev-qa-db-ja.com

Dockerイメージへのudunits2パッケージのインストール

Rパッケージudunits2/unitsをDockerイメージにインストールしようとしています

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-ubunt

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

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

何か案は?よろしくお願いします!

3
celine

次の解決策は、udunits2パッケージHiebert( https://superuser.com/users/1052048/hiebert )の作成者によって提案された回避策の要約です。彼は、次の理由で解決策を投稿できませんでした。ここにいくつかの過度にアクティブなスパムフィルターがあります...それで、すべてのクレジットは彼に行きます、あなたの助けに感謝します、Hiebert!

私はjupyternotebooks(jupyter/datascience-notebook:abdb27a6dfbb)によって提供されるdockerイメージから始めました。このイメージにはAnacondaを介してRがインストールされており、特にanacondaは通常のgccコンパイラを独自のコンパイラに置き換えています。

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

何らかの理由で、anacondaコンパイラはパッケージのコンパイルを拒否します。ただし、通常のgccコンパイラは問題なく動作します。したがって、1つの解決策は、コンパイラの変更を変更することです( 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ノートブックが欲しかったので、これも試しませんでした)

あります!これが誰かに役立つことを願っています:)

1
celine