我正在尝试使用 openjdk 11 构建一个 alpine docker 镜像。为此,我启动了一个 alpine 容器:
docker run -it alpine:3.9 /bin/sh
并运行以下命令:
export JAVA_HOME=/opt/openjdk-11
export PATH=$JAVA_HOME/bin:$PATH
export JAVA_VERSION=11.0.2
export JAVA_URL=https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
export JAVA_SHA256=99be79935354f5c0df1ad293620ea36d13f48ec3ea870c838f20c504c9668b57
set -eux; \
\
wget -O /openjdk.tgz "$JAVA_URL"; \
echo "$JAVA_SHA256 */openjdk.tgz" | sha256sum -c -; \
mkdir -p "$JAVA_HOME"; \
tar --extract --file /openjdk.tgz --directory "$JAVA_HOME" --strip-components 1; \
rm /openjdk.tgz;
此后,我可以确认以下几件事是正确的:
/ # ls -lah $JAVA_HOME/bin/java
+ ls -lah /opt/openjdk-11/bin/java
-rwxr-xr-x 1 668 668 8.5K Jan 18 05:20 /opt/openjdk-11/bin/java
/ # echo $PATH
+ echo /opt/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/opt/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/ # which java
+ which java
/opt/openjdk-11/bin/java
但是当我运行java
它时,我得到:
/ # java -version
+ java -version
/bin/sh: java: not found
然后我就被踢出了容器。我是不是错过了什么?
答案1
您收到的原因java: not found
可能是由于动态链接失败。您可以使用 进行验证ldd java
。
Alpine Linux 正在使用musl-libc用于其 libc(标准 C 库)实现,与大多数使用其他 Linux 不同glibc,GNU 的 C 库。因此,在非 Alpine 发行版上构建的标准 Linux 软件通常会与 glibc 链接,如果不安装 glibc 兼容层,则无法在 Alpine 上运行。因此,您需要一个 OpenJDK 11 Alpine 版本。
但不幸的是,这种构建目前尚未实现。OpenJDK 11 页面状态:
本页上之前提供的 Alpine Linux 版本已从 JDK 11 GA 中删除。它尚未投入生产,因为它尚未经过充分的测试,因此不能被视为 GA 版本。
替代方案包括:
在 Alpine 容器上安装正确的 glibc。这是一个相当简单的过程,它将允许您在 Alpine 上运行任何 Linux 软件。但是,您将不再运行“原生 Alpine”。对于安装程序,因此邮政。
从 OpenJDK 供应商处安装非官方的 OpenJDK 11 Alpine。具体来说,Zulu OpenJDK 是一个非常好的替代方案,它提供经过全面测试和验证的版本,而且也是免费和开源的。
更多信息请参阅此 StackOverflow 帖子:
为什么 Java 11 基础 Docker 镜像这么大?(openjdk:11-jre-slim)
更新:
截至 2019 年 2 月 6 日,该openjdk11
软件包已在 Alpine 存储库中可用!可以使用以下命令从存储库中获取它edge/community
:
apk --no-cache add openjdk11 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
答案2
Openjdk11 适用于 alpine 版本 3.11。安装方法:
更新版本:vim /etc/apk/repositories
bash-4.4# cat /etc/apk/repositories http://dl-cdn.alpinelinux.org/alpine/v3.11/main http://dl-cdn.alpinelinux.org/alpine/v3.11/community
升级:apk升级
获取:apk add --no-cache openjdk11
bash-4.4# java -version openjdk version "11.0.5" 2019-10-15 OpenJDK Runtime Environment (build 11.0.5+10-alpine-r0) OpenJDK 64-Bit Server VM (build 11.0.5+10-alpine-r0, mixed mode)