微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在构建 docker 镜像时突然 apk jdk11 安装停止工作?

如何解决为什么在构建 docker 镜像时突然 apk jdk11 安装停止工作?

我正在 alpine 上构建一个 java 应用程序 runnign 并使用 alpine 包管理器安装 jdk11,但从昨晚突然出现问题。 我没有更改 docker 文件中的任何内容,所以可能是更新了某些软件包?

这是我的 Dockerfile

FROM amd64/alpine:3.7
RUN apk update
RUN apk --no-cache add openjdk11-jdk --repository=http://dlcdn.alpinelinux.org/alpine/edge/community
ENV JAVA_HOME=/usr/lib/jvm/default-jvm
ENV PATH=$JAVA_HOME/bin:$PATH

RUN apk --no-cache add bash
copY ./target/myapp-.jar /
EXPOSE 80
CMD ["java","-jar","/myapp.jar"]

它曾经可以很好地构建图像,但突然间我看到以下错误

 ---> Running in 324f142bbf15
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
... //some content omitted for simplicity
(25/25) Installing openjdk11-jre (11.0.9_p11-r1)
Executing busyBox-1.27.2-r11.trigger
Executing java-common-0.3-r0.trigger
sort: unrecognized option: V
BusyBox v1.27.2 (2018-06-06 09:08:44 UTC) multi-call binary.

Usage: sort [-nrugMcszbdfiokt] [-o FILE] [-k start[.offset][opts][,end[.offset][opts]] [-t CHAR] [FILE]...

Sort lines of text

    -o FILE Output to FILE
    -c  Check whether input is sorted
    -b  Ignore leading blanks
    -f  Ignore case
    -i  Ignore unprintable characters
    -d  Dictionary order (blank or alphanumeric only)
    -g  General numerical sort
    -M  Sort month
    -n  Sort numbers
    -t CHAR Field separator
    -k N[,M] Sort by Nth field
    -r  Reverse sort order
    -s  Stable (don't sort ties alphabetically)
    -u  Suppress duplicate lines
    -z  Lines are terminated by NUL,not newline

我之前没有收到此错误 请问有人可以帮忙解决这个问题吗? 这导致在 alpine linux 上没有正确安装 java

解决方法

本质上,您的 Dockerfile 有两个与此错误相关的关键问题。

第一个:您将特定版本的 Alpine 基础映像(这很好)修复为 3.7,但是,您强制 apk 不使用 3.7 的本机存储库,而是edge 一个,它是一个包含最新软件的开发存储库,旨在拥有随时间进步版本的软件包。

这就是您看到的错误的确切原因,因为 openjdk11-jdk 软件包最近更新(11 月 30 日)并且针对最新的 Alpine 版本,而不关心与旧版 3.7 的兼容性。因此,您从 openjdk11-jdk 存储库中获取了 edge,它对您有用,但是一旦 3.7 和最新的 Alpine 版本变得完全不同 em>,你的构建变得残废了。在 3.7 中,sort 没有 -V 选项,但在以后的版本中它有:

$ docker run -it alpine:3.7
/ # sort -V
sort: unrecognized option: V
BusyBox v1.27.2 (2018-06-06 09:08:44 UTC) multi-call binary.

Usage: sort [-nrugMcszbdfiokt] [-o FILE] [-k start[.offset][opts][,end[.offset][opts]] [-t CHAR] [FILE]...

<Long RTFM goes here>

$ docker run -it alpine:3.13
/ # sort -V

<Silently works>

第二个问题是你没有为包本身指定确切的版本,这意味着“安装你想要的任何东西”。通常这意味着“安装最新的可用版本”,因此,apk 再次成功地在 edge 存储库中找到最新版本(因为您强迫它在那里查找),并将其作为 有效的,这是不正确的:此软件包版本不打算在 3.7 上运行。

有时,Alpine 3.7 似乎只有 OpenJDK 7 和 8(这可能就是您瞄准 edge 存储库的原因),所以这里的好解决方案是:

  1. 将基础镜像版本升级到新版本(例如,Alpine 3.13 的存储库中已经有 openjdk11);
  2. 不要以 edge 存储库为目标,它不打算用于可重现的构建;
  3. 修复正在安装的软件包的特定版本。

Dockerfile 的开头如下所示:

FROM amd64/alpine:3.13.0
RUN apk update
RUN apk --no-cache add openjdk11-jdk=11.0.9_p11-r1

一旦完成这些事情,您的构建可能会出人意料地崩溃的唯一方法是偶尔修改存储库中的特定包版本或将其删除(这不太可能,甚至会发生,错误消息将非常清楚并且可以理解)。

作为底线,我建议您使用 Hadolint 来捕捉这些挥之不去的错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。