簡體   English   中英

Docker alpine + oracle java:找不到java

[英]Docker alpine + oracle java: cannot find java

我一直在嘗試使用 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,但無濟於事。

我錯過了什么?

編輯: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

你無法實現你想要的

Alpine Linux 使用 MUSL 作為標准 C 庫。

Oracle 的 Java for linux 依賴於 GNU 標准 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 的許可協議,該協議規定許可不可轉讓,可分發的內容不可修改 然而,在Dockerfile你會發現:

Cookie: oraclelicense=accept-securebackup-cookie"

許多條目類似於

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

有關預打包 Oracle 的JREJDK Docker 映像的合法性的更多詳細信息, 請參閱本文

我找到了一個最終有效的答案。 所需要的只是GlibC 非常感謝S. Gerrand ,這是一個很大的幫助。

以下是如何讓舊的 JDK 8 在 Alpine 1.13 中運行:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM