gpt4 book ai didi

java - Docker alpine + oracle java : cannot find java

转载 作者:IT老高 更新时间:2023-10-28 12:46:11 25 4
gpt4 key购买 nike

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

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

我错过了什么?

编辑: jetty worker 的最终输出是:命令'/bin/sh -c java -version'返回一个非零代码: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

最佳答案

你无法实现你想要的

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

the JDK source code has not yet been ported to Alpine Linux, or more specifically, the musl C library. That is, it turns out that the thing about Alpine Linux that sticks out/is different from a JDK source code perspective is the C library.

解决方案

如果您正在寻找小型 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 的许可协议(protocol),该协议(protocol)声明该许可不可转让,并且可分发是 < strong>不可修改。然而,在 Dockerfile 中你会发现:

Cookie: oraclelicense=accept-securebackup-cookie"

还有很多类似的条目

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

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

关于java - Docker alpine + oracle java : cannot find java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45147371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com