【问题标题】:Docker alpine + oracle java: cannot find javaDocker alpine + oracle java:找不到java
【发布时间】:2017-07-17 14:51:19
【问题描述】:

我一直在尝试使用 Oracle Java(而不是 openjdk)创建一个基于 alpine 的 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 目录)以帮助调试,但现在我卡住了:RUN which java 按预期返回/opt/jdk/bin/java,但RUN java -version 返回/bin/sh: java: not found

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

我错过了什么?

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

最终编辑:

感谢 diginoise 让我了解 MUSL 与 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

【问题讨论】:

  • 你从 echo $JAVA_HOME 和 $PATH 中得到了什么?
  • JAVA_HOME:/opt/jdk 路径:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/jdk/bin
  • 你可以试试RUN echo "$(java -version)" 吗?
  • 我使用 echo "$(java -version)" 得到相同的输出
  • 您假设 Java 将驻留在哪里...您能否启动与容器的交互会话并验证 Java 的确切位置

标签: java docker dockerfile


【解决方案1】:

你无法实现你想要的

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

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

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

JDK 源代码尚未移植到 Alpine Linux,或者更具体地说,是 musl C 库。也就是说,从 JDK 源代码的角度来看,Alpine Linux 突出/不同的是 C 库。

解决方案

如果您正在寻找小型 Java Docker 映像,use OpenJDK ones

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


如果你坚持,那就去吧……

理论上有办法,​​but it is not as trivial as you think

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

请注意...

所有这些解决方案可能违反 Oracle 的许可协议,该协议声明该许可不可转让,并且可分发是 不可修改。 但是,在Dockerfiles 中,您会发现:

Cookie: oraclelicense=accept-securebackup-cookie"

还有很多类似的条目

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

有关预打包 Oracle 的 JREJDK Docker 映像的合法性的更多详细信息see this article

【讨论】:

  • .. 因为他看到的退出代码来自一个崩溃的 Java 进程,该进程错过了上述依赖项
  • 您可以找到使用 OracleJDK herehere 运行的 Alpine 映像示例。它基本上总是关于添加缺少的 GNU C 库。
  • @LazerBass 请编辑我的答案以添加 2 个具有 glibC 的 docker alpine 图像,我很乐意批准!
  • 从我在互联网上看到的情况来看,这不是一个正确的答案。 developer.atlassian.com/blog/2015/08/…
  • @b01 请在我的答案更新中找到详细信息。将 Oracle 的 java 添加到 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

【讨论】:

  • 除非有任何许可问题,否则此方法有效。图像大小为 408MB。不理想。但也不错。它们可能是一些可以完成的清理工作。
【解决方案3】:

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

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

【讨论】:

  • 请找到我的更新答案以及关于打包 Oracle 二进制文件的合法性的讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多