Docker alpine+;oracle java:找不到java

Docker alpine+;oracle java:找不到java,java,docker,dockerfile,Java,Docker,Dockerfile,我一直在尝试使用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"\ htt

我一直在尝试使用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 dir)是为了帮助调试而添加的,但现在我被卡住了:
运行JAVA
返回的
/opt/jdk/bin/JAVA
,但是
运行JAVA-version
返回
/bin/sh:JAVA:not found

我尝试了一些方法,包括将可执行文件符号链接到/usr/bin中,但没有成功

我错过了什么

编辑: docker的最终输出为:
命令'/bin/sh-cjava-version'返回一个非零代码: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
位于:

您无法实现自己的目标 Alpine Linux使用MUSL作为标准C库

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

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

解决方案 如果您正在寻找小型Java Docker图像

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


如果你坚持,就在你头上吧。。。 有理论的方法

您可以找到许多使用OracleJDK运行的阿尔卑斯山图像的示例,如或参阅的对这个问题的回答。 他们添加了缺失的标准GNUC库

不过,请注意。。。 所有这些解决方案都可能违反Oracle的许可协议,该协议规定许可证不可转让,且可分发的许可证不可修改。 但是,在
Dockerfile
s中,您会发现:

Cookie: oraclelicense=accept-securebackup-cookie"
和许多类似的条目

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

有关预打包Oracle的JREJDKDocker映像合法性的更多详细信息。

如果任何人需要新版本的JDK,我将维护Alpine Oracle JDK映像

来源
我终于找到了一个有效的答案。所需要的只是一个简单的例子;非常感谢,这是一个很大的帮助

下面介绍如何在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
来自阿尔卑斯山的
:3.13
运行apk--无进展--清除--无缓存升级\
&&apk--无进展--清除--无缓存添加--升级\
卷曲\
wget\
openssh\
&&apk--无进展--清除--无缓存升级\
&&rm-vrf/var/cache/apk/*\
&&curl——版本
#安装GLibC:https://github.com/sgerrand/alpine-pkg-glibc
运行curl-o/etc/apk/keys/sgerrand.rsa.pubhttps://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
&&旋涡https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk \
&&apk添加glibc-2.32-r0.apk
运行wget-c--标题“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
环境JAVA_HOME/opt/jdk
环境路径$PATH:/opt/jdk/bin
运行echo$JAVA_HOME&&\
echo$PATH
运行哪个java
运行java版本
入口点[“java”]
#测试运行:docker run-t khalifahks/alpine java-version
#docker导出| docker导入-哈利法克斯/阿尔卑斯爪哇:导出
#快速交互术语:docker run-it--entrypoint=sh khalifahks/alpine java sh

你从echo$JAVA\u HOME和$PATH中得到了什么?JAVA\u HOME:
/opt/jdk
PATH:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/opt/jdk/bin
你能试试
运行echo“$(JAVA-version)”
吗?我使用echo“$(JAVA-version)”得到相同的输出,你假设JAVA将驻留在哪里。。。您能用容器启动交互式会话并验证Java的确切位置吗。。因为他看到的退出代码来自一个崩溃的Java进程,该进程忽略了前面提到的依赖项,所以您可以找到使用OracleJDK和运行的Alpine映像的示例。它基本上总是关于添加丢失的GNU C库。@LazerBass请编辑我的答案,添加2张docker alpine图片,上面有glibC,我很乐意批准!从我在互联网上看到的情况来看,这并不是一个正确的答案@b01请在我的答案更新中查找详细信息。将Oracle的java添加到docker映像可能违反了他们的许可协议。请查找我的更新答案以及有关打包Oracle二进制文件的合法性的讨论。除非存在任何许可问题,否则这是有效的。图像大小为408MB。不理想。但也不算太坏。它们可能是一些可以完成的清理工作。