当前位置: 首页 > 知识库问答 >
问题:

Docker alpine oracle java:找不到java

秦伯寅
2023-03-14

我一直在尝试用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返回JAVA:not found

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

我错过了什么?

编辑:docker的最终输出是:命令'/bin/sh-c java-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

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


共有3个答案

骆鸿运
2023-03-14

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

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

丁志勇
2023-03-14

我终于找到了一个可行的答案。所需要的只是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
锺离明煦
2023-03-14

阿尔卑斯Linux使用MUSL作为标准C库。

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

以下是甲骨文在这个话题上更详细的信息和官方立场

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

如果您想寻找小型Java Docker图像,请使用OpenJDK图像。

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

有理论上的方法,但它并不像你们认为的那个么琐碎。

您可以在这里找到许多使用OracleJDK运行的Alpine图像示例,也可以看到专家对这个问题的答案。他们添加了缺失的标准GNU C库。

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

Cookie: oraclelicense=accept-securebackup-cookie"

许多条目类似于

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

有关预打包Oracle的JRE或JDK Docker映像合法性的更多详细信息,请参阅本文。

 类似资料:
  • 问题内容: 我正在运行Windows 8,但无法使javac正常工作。 我已将环境变量中的PATH设置为 我尝试过是否使用’;’ 但无济于事。 我最近在桌面上添加了这个问题;工作,但不是这种情况。 我确保javac确实也存在于bin中。 关于修复的任何建议将不胜感激。 编辑echo%PATH%给出: 确切的错误是:无法将“ javac”识别为内部或外部命令,可操作程序或批处理文件。 问题答案: 至

  • 我运行的是Windows 8,无法让javac运行。 我把环境变量中的路径设置为 我试过带和不带';'但没有用。 最近,我的桌面上出现了这个问题,并添加了:;成功了,但这次不是。 我已经确保javac也存在于垃圾箱中。 如有任何修复建议,将不胜感激。 编辑回声%PATH%给出: 确切的错误是:“javac”不能被识别为内部或外部命令、可操作程序或批处理文件。

  • 问题内容: 我已经安装了两个jdk-jdk 1.5和jdk 1.8。我有以下Ant build.xml配置文件: 在安装jdk1.8之前,从Eclipse调用的Ant成功编译了所有源代码。但是现在,我有以下错误消息: 我的JAVA_HOME和JRE_HOME: 并在Eclipse JRE中将其设置为1.5。Java 1.8在安装过程中会设置一些配置吗? 问题答案: 已知低于1.9.0的Apache

  • 我已经安装了两个JDK--JDK1.5和JDK1.8。我有以下Ant build.xml配置文件: 在安装JDK1.8之前,从Eclipse调用的Ant成功地编译了所有源代码。但现在,我有以下错误消息: 我的JAVA_HOME和JRE_HOME: 并在Eclipse JRE中设置为1.5。Java 1.8在安装过程中是否设置了一些配置?

  • 当我尝试启动UIAutomatorViewer.bat时,我得到以下错误: 错误:没有找到合适的Java。为了正确使用Android Developer工具,您需要在系统上安装一个合适的Java JDK版本。我们建议您安装JDK版本的JavaSE,可在以下站点获得:http://www.oracle.com/technetwork/java/JavaSE/downloads 如果已经安装了Java

  • 问题内容: 我正在尝试将Spring与Hibernate结合使用。View使用JSTL。当我在浏览器中打开页面时,我看到错误: 这是我与pom.xml的依赖关系的一部分,与此相关: 哪里有问题?我正在使用tomcat版本6。 问题答案: 问题出在web.xml中的servlet版本错误。我已经做到2.5了,所有的作品。

  • 问题内容: 我收到以下错误: 但是,当我将错误中列出的select语句复制并粘贴到mysql shell中时,我得到了结果,这是预期的,因为该表具有column 。 发生此错误的原因可能是什么? 这是表的创建语句: 这是我的dao类中有关该表的几行内容: 问题答案: 检查您的SQL语句-您需要在列列表中包括: 之所以失败,是因为您尝试从中提取内容,而该内容不存在。

  • 无法从收到此错误的终端启动JMeter: 我的系统上有Java8,我的系统上也设置了,但JMeter无法获得它。