Docker alpine + oracle java:找不到java

时间:2017-07-17 14:51:19

标签: java docker dockerfile

我一直在尝试用Oracle Java(而不是openjdk)创建一个基于阿尔卑斯的docker镜像。我被特别要求在这里创建我们自己的图像。

这是我提出的Dockerfile:

FROM alpine:3.6

RUN apk add --no-cache curl wget

RUN mkdir /opt/ && \
    wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie"\
    http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz && \
    tar xvf jdk-8u131-linux-x64.tar.gz -C /opt/ && \
    rm jdk-8u131-linux-x64.tar.gz && \
    ln -s /opt/jdk1.8.0_131 /opt/jdk

ENV JAVA_HOME /opt/jdk
ENV PATH $PATH:/opt/jdk/bin

RUN echo $JAVA_HOME && \
    echo $PATH

RUN which java
RUN java -version

有一些不必要的命令(比如回显JAVA_HOME dir),这些命令被添加以帮助调试,但现在我被卡住了:RUN which java按预期返回/opt/jdk/bin/java,但是RUN java -version返回/bin/sh: java: not found

我尝试了一些方法,包括将可执行文件符号链接到/ usr / bin,但无济于事。

我错过了什么?

编辑: docker的最终输出是: The command '/bin/sh -c java -version' returned a non-zero code: 127

最终编辑:

感谢diginoise让我加入MUSL vs libc。我发现在我的Dockerfile中添加以下内容可以让我构建一个工作映像:

RUN apk --no-cache add ca-certificates && \
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub && \
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-2.25-r0.apk && \
apk add glibc-2.25-r0.apk

发现于:https://github.com/sgerrand/alpine-pkg-glibc

3 个答案:

答案 0 :(得分:12)

你无法实现自己想要的目标。

Alpine Linux使用MUSL作为标准C库。

Oracle的Java for Linux依赖于GNU标准C库(gclib)。

有理论方法,但它并不像你想象的那样微不足道。

请参阅this link

您可以找到使用OracleJDK herehere运行的Alpine图像的示例。这两个例子都是添加缺少的GNU C库。

Here is a bit more detailed info and official stance from Oracle on the topic

  

JDK源代码尚未移植到Alpine Linux,或者更具体地说,移植到musl C库。也就是说,事实证明,关于Alpine Linux的内容与JDK源代码的不同之处在于C库。

简而言之,使用官方的Oracle Java Docker镜像

答案 1 :(得分:1)

我找到了一个最终有效的答案。所需要的只是 GlibC;非常感谢 S. Gerrand,这是一个很大的帮助。

以下是在 Alpine 1.13 中运行旧版 JDK 8 的方法:

FROM alpine:3.13

RUN apk --no-progress --purge --no-cache upgrade \
&& apk --no-progress --purge --no-cache add --upgrade \
    curl \
    wget \
    openssh \
&& apk --no-progress --purge --no-cache upgrade \
&& rm -vrf /var/cache/apk/* \
&& curl --version

# Install vanilla GLibC: https://github.com/sgerrand/alpine-pkg-glibc
RUN curl -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
&& curl -LO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk \
&& apk add glibc-2.32-r0.apk

RUN wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" \
        http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz \
  && tar xvf jdk-8u131-linux-x64.tar.gz -C /opt \
  && rm jdk-8u131-linux-x64.tar.gz \
  && ln -s /opt/jdk1.8.0_131 /opt/jdk

ENV JAVA_HOME /opt/jdk
ENV PATH $PATH:/opt/jdk/bin

RUN echo $JAVA_HOME && \
    echo $PATH

RUN which java
RUN java -version

ENTRYPOINT [ "java" ]

# To test run: docker run -t khalifahks/alpine-java -version
# docker export <container-id> | docker import - khalifahks/alpine-java:exported
# quick interative termnal: docker run -it --entrypoint=sh khalifahks/alpine-java sh

答案 2 :(得分:0)

万一有人需要新版本的JDK,我会维护Alpine Oracle JDK映像https://hub.docker.com/repository/docker/expert/docker-java-minimal/

来源 https://github.com/unoexperto/docker-java-minimal/