【发布时间】:2017-07-17 14:51:19
【问题描述】:
我一直在尝试使用 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,但无济于事。
我错过了什么?
编辑:
码头工人的最终输出是:
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
【问题讨论】:
-
你从 echo $JAVA_HOME 和 $PATH 中得到了什么?
-
JAVA_HOME:
/opt/jdk路径:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/jdk/bin -
你可以试试
RUN echo "$(java -version)"吗? -
我使用 echo "$(java -version)" 得到相同的输出
-
您假设 Java 将驻留在哪里...您能否启动与容器的交互会话并验证 Java 的确切位置
标签: java docker dockerfile