基于Ubuntu20.04的Dockerfile构建时dpkg configure报错求助
解决方案
问题根源
报错核心原因是
DEBIAN_FRONTEND=noninteractive仅会关闭交互式操作向导,但不会自动处理配置文件冲突的选择逻辑,因此netbase包的/etc/protocols文件冲突时仍会触发交互提示,非交互环境下stdin读取结束直接报错。
可行修改步骤
- 第一步:删除原Dockerfile中冗余的
RUN dpkg --configure -a -y行,官方干净的ubuntu:20.04基础镜像不存在待配置的包,这行是触发本次报错的诱因之一。 - 第二步:在所有apt相关操作前,添加全局dpkg配置,指定配置文件冲突的默认处理规则,避免交互提示:
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \ && echo 'Dpkg::Options { "--force-confdef"; "--force-confold"; }' > /etc/dpkg/dpkg.cfg.d/99noninteractive
参数说明:
--force-confdef:如果包提供了默认配置选项,自动使用默认值--force-confold:配置文件发生冲突时,默认保留当前已有的版本,不会覆盖;如果需要强制使用包维护者的新版本,可以替换为--force-confnew- 第三步:可选优化,合并多个apt安装命令为同一RUN层,最后统一清理apt缓存,大幅减小镜像体积:
RUN apt-get clean \ && apt-get update \ && apt-get install -f -y \ python3 \ python3-pip \ python3-setuptools \ wget \ poppler-utils \ jq \ pdftk-java \ ghostscript \ dialog \ apt-utils \ && pip3 install --upgrade pip \ && pip3 --no-cache-dir install --upgrade awscli \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*
修改后完整Dockerfile示例
FROM ubuntu:20.04 RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \ && echo 'Dpkg::Options { "--force-confdef"; "--force-confold"; }' > /etc/dpkg/dpkg.cfg.d/99noninteractive RUN apt-get clean \ && apt-get update \ && apt-get install -f -y \ python3 \ python3-pip \ python3-setuptools \ wget \ poppler-utils \ jq \ pdftk-java \ ghostscript \ dialog \ apt-utils \ && pip3 install --upgrade pip \ && pip3 --no-cache-dir install --upgrade awscli \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* WORKDIR /tmp COPY lib/pdf2htmlEX-0.18.8.rc1-master-20200630-Ubuntu-focal-x86_64.deb /tmp RUN apt install -y ./pdf2htmlEX-0.18.8.rc1-master-20200630-Ubuntu-focal-x86_64.deb RUN wget https://www.imagemagick.org/download/ImageMagick.tar.gz && \ tar -xf ImageMagick.tar.gz && \ cd ImageMagick* && \ ./configure && \ make && \ make install && \ ldconfig /usr/local/lib
内容的提问来源于stack exchange,提问作者David Faizulaev
相关产品推荐
相关产品推荐

