作者:江山代有人2502914563 | 来源:互联网 | 2023-01-29 13:59
我一直在尝试用Oracle Java(而不是openjdk)创建一个基于阿尔卑斯的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和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
1> diginoise..:
你无法达到你想要的效果.
Alpine Linux使用MUSL作为标准C库.
Oracle的Java for Linux依赖于GNU标准C库(gclib).
有理论方法,但它并不像你想象的那样微不足道.
看到这个链接
您可以在此处和此处找到与OracleJDK一起运行的Alpine图像的示例.这两个例子都是添加缺少的GNU C库.
以下是Oracle关于该主题的更详细的信息和官方立场
JDK源代码尚未移植到Alpine Linux,或者更具体地说,移植到musl C库.也就是说,事实证明,关于Alpine Linux的内容与JDK源代码的不同之处在于C库.
简而言之,使用官方的Oracle Java Docker镜像