debian下dockerfile封装报错Docker fails with Sub-process /usr/bin/dpkg returned an error code (1)Docker 失败,子进程 /usr/bin/dpkg 返回错误代码 (1)

【问题标题】:Docker fails with Sub-process /usr/bin/dpkg returned an error code (1)Docker 失败,子进程 /usr/bin/dpkg 返回错误代码 (1)
【问题描述】:

我在尝试将 JRE 安装到我的 docker 容器时遇到问题。

我不断收到错误消息;

Processing triggers for libc-bin (2.28-10) ...
Processing triggers for systemd (241-7~deb10u1) ...
Processing triggers for ca-certificates (20190110) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

done.
done.
Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ...
Errors were encountered while processing:
 openjdk-11-jre-headless:amd64
 openjdk-11-jre:amd64
 default-jre
E: Sub-process /usr/bin/dpkg returned an error code (1)

如果我稍微向上滚动一下构建输出,我还会看到以下问题;

Setting up default-jre-headless (2:1.11-71) ...
Setting up openjdk-11-jre-headless:amd64 (11.0.4+11-1~deb10u1) ...
update-alternatives: using /usr/lib/jvm/java-11-openjdk-amd64/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode
update-alternatives: error: error creating symbolic link '/usr/share/man/man1/rmid.1.gz.dpkg-tmp': No such file or directory
dpkg: error processing package openjdk-11-jre-headless:amd64 (--configure):
 installed openjdk-11-jre-headless:amd64 package post-installation script subprocess returned error exit status 2
dpkg: dependency problems prevent configuration of openjdk-11-jre:amd64:
 openjdk-11-jre:amd64 depends on openjdk-11-jre-headless (= 11.0.4+11-1~deb10u1); however:
  Package openjdk-11-jre-headless:amd64 is not configured yet.

dpkg: error processing package openjdk-11-jre:amd64 (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of default-jre:
 default-jre depends on openjdk-11-jre; however:
  Package openjdk-11-jre:amd64 is not configured yet.

dpkg: error processing package default-jre (--configure):
 dependency problems - leaving unconfigured
Setting up ca-certificates-java (20190405) ...
head: cannot open '/etc/ssl/certs/java/cacerts' for reading: No such file or directory

我的 Dockerfile 很简单,但它就是行不通

FROM nginx:latest

RUN apt-get update -y && apt-get install -y \
    unzip \
    wget \
    default-jre \
    nginx

【解决方案1】:

jre 安装需要man 文件夹存在于服务器上,试试这个:

FROM nginx:latest

RUN mkdir -p /usr/share/man/man1

RUN apt-get update -y && apt-get install -y \
    unzip \
    wget \
    default-jre \
    nginx
【解决方案2】:

以下是有关此问题的一些背景信息。发生这种情况是因为安装后脚本尝试为 java 运行 update-alternatives 并且文件夹 /usr/share/man/man1 不存在,正如 LinPy 的答案中已经解释的那样。

以下 Debian 错误更详细地讨论了此问题,并通过创建它们的 issing 文件夹记录了解决方法: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199#23

OpenJDK 8 似乎最近关闭了这个问题,但它似乎在较新的 JDK 中仍然存在,请参阅:

https://salsa.debian.org/openjdk-team/openjdk/-/blob/master/debian/JB-jdk-headless.postinst.in

以下补丁可以解决此问题,并且可能也应该添加到较新的 OpenJDK 版本中:

diff --git a/debian/JB-jdk-headless.postinst.in b/debian/JB-jdk-headless.postinst.in
index 0e1ef5f..e3afef1 100644
--- a/debian/JB-jdk-headless.postinst.in
+++ b/debian/JB-jdk-headless.postinst.in
@@ -43,6 +43,7 @@ configure)
     if [ -n "$multiarch" ] && [ "$DPKG_MAINTSCRIPT_ARCH" != $(dpkg --print-architecture) ]; then
        priority=$(expr $priority - 1)
     fi
+    test -d /usr/share/man/man1 || mkdir -p /usr/share/man/man1
     for i in $jdk_hl_tools; do
        unset slave1 slave2 || true
         if [ -e $mandir/man1/$i.$srcext ]; then
posted @ 2023-04-25 16:35  海_纳百川  阅读(174)  评论(0编辑  收藏  举报
本站总访问量