Docker alpine + oracle java:找不到 java

2022-09-03 06:13:28

我一直在尝试使用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/javaRUN 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


答案 1

你无法实现你想要的

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

Oracle的Java for linux依赖于GNU Standard C库(gclib)。

以下是Oracle关于该主题的更详细的信息和官方立场

JDK源代码尚未移植到Alpine Linux,或者更具体地说,是musl C库。也就是说,事实证明,与JDK源代码视角不同,Alpine Linux的东西是C库。

解决方案

如果你正在寻找小型Java Docker镜像,请使用OpenJDK镜像

openjdk:11-jre-slim图像只有77MB


如果你坚持,在你的头上吧...

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

您可以像在这里找到许多使用OracleJDK运行的Alpine映像的示例,或者查看专家对此问题的回答。他们添加了缺少的标准GNU C库。

但是要注意...

所有这些解决方案都可能违反Oracle的许可协议,该协议规定许可证不可转让,可分发的许可证不可修改。然而,在s中,你会发现:Dockerfile

Cookie: oraclelicense=accept-securebackup-cookie"

和许多类似于

rm -rf ${JAVA_HOME}/*src.zip

有关预打包的 Oracle JREJDK Docker 映像的合法性的更多详细信息,请参阅此文章


答案 2

我终于找到了一个有效的答案。所需要的只是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

推荐