r语言 - Docker, Jenkins, and rJava



我正在运行的 Jenkins 作业的一部分需要安装rJava; Jenkins 作业在我可以控制的 docker 映像上运行,但我似乎仍然无法安装rJava

环顾四周,似乎确保运行R CMD javareconf是这一切的关键,事实上,我添加了&& R CMD javareconf作为我Dockerfile中的最后一个命令。Docker 映像的编译包含:

Java interpreter : /docker-java-home/jre/bin/java
Java version     : 1.8.0_171
Java home path   : /docker-java-home
Java compiler    : /docker-java-home/bin/javac
Java headers gen.: /docker-java-home/bin/javah
Java archive tool: /docker-java-home/bin/jar
trying to compile and link a JNI program 
detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/docker-java-home/include -I/docker-java-home/include/linux     -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-3.3.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
gcc -std=gnu99 -shared -L/usr/lib/R/lib -Wl,-z,relro -o conftest.so conftest.o -L/docker-java-home/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR

JAVA_HOME        : /docker-java-home
Java library path: $(JAVA_HOME)/jre/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.

现在,当我进入 Docker 实例 (docker exec -it jenkins_img bash( 时,我实际上可以手动安装rJavainstall.packages('rJava')按预期工作;重要的是,这是那里输出的一部分:

checking Java support in R... present:
interpreter : '/docker-java-home/jre/bin/java'
archiver    : '/docker-java-home/bin/jar'
compiler    : '/docker-java-home/bin/javac'
header prep.: '/docker-java-home/bin/javah'
cpp flags   : '-I/docker-java-home/include -I/docker-java-home/include/linux'
java libs   : '-L/docker-java-home/jre/lib/amd64/server -ljvm'

但是,当我运行作为 Jenkins 作业一部分的脚本时,相应的输出变为:

checking Java support in R... present:
interpreter : '/usr/lib/jvm/default-java/jre/bin/java'
archiver    : '/usr/lib/jvm/default-java/bin/jar'
compiler    : '/usr/lib/jvm/default-java/bin/javac'
header prep.: '/usr/lib/jvm/default-java/bin/javah'
cpp flags   : '-I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux'
java libs   : '-L/usr/lib/jvm/default-java/jre/lib/amd64/server -ljvm'
checking whether Java run-time works... ./configure: line 3747: /usr/lib/jvm/default-java/jre/bin/java: No such file or directory
no
configure: error: Java interpreter '/usr/lib/jvm/default-java/jre/bin/java' does not work

因此,似乎当我docker execbash时正在运行的任何进程都与在我的 Jenkins 作业下运行的进程具有不同的JAVA_HOME。为此,我直接在脚本中安装rJava行之前添加了以下内容(如建议(:

export JAVA_HOME=/docker-java-home/
export PATH=$PATH:$JAVA_HOME/bin
Rscript -e 'install.packages("rJava")'

但是,此操作在相同的输出下失败。我还通过catSys.getenv('JAVA_HOME')并确认它是/docker-java-home/来检查运行install.packagesR 进程是否具有相同的JAVA_HOME

Jenkins 脚本没有根访问权限,所以我无法在那里运行R CMD javareconf

如何让install.packages('rJava')使用正确的JAVA_HOME

FWIW,这些天我在 Docker 映像中使用了以下内容的一些变体来正确构建rJava

# rJava
RUN apt-get update && apt-get install -y libudunits2-dev gnupg2 software-properties-common
RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" 
| tee /etc/apt/sources.list.d/webupd8team-java.list 
&&  echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" 
| tee -a /etc/apt/sources.list.d/webupd8team-java.list 
&& apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 
&& echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" 
| /usr/bin/debconf-set-selections 
&& apt-get update 
&& apt-get install -y oracle-java8-installer 
&& update-alternatives --display java 
&& rm -rf /var/lib/apt/lists/* 
&& apt-get clean 
&& R CMD javareconf

这不是我自己的特别工作,我基本上是从@daroczig中获取的:

https://github.com/rocker-org/rocker/issues/109

https://hub.docker.com/r/cardcorp/r-java/dockerfile/

最新更新