Docker 命令需要键盘交互

Docker commands require keyboard interaction

我正在尝试创建用于翻录 CD 的 Docker 图像(使用 abcde)。 这是 Docker 文件的相关部分:

FROM ubuntu:17.10
MAINTAINER Graham Nicholls <graham@rockcons.co.uk>
RUN apt update && apt -y install eject vim ruby abcde
...

不幸的是,包 "abcde" 引入了一个邮件客户端(不确定是哪个),并且 apt 试图通过询问要配置的邮件连接类型(smarthost/relay 等)来配置它。

当 docker 运行时,它似乎没有从标准输入读取,所以我无法重定向到 docker 进程。

我试过将 --nodeps 与 apt 一起使用(并将 apt 替换为 apt-get);不幸的是 --nodeps 似乎不再是受支持的选项并且 returns:

E: Command line option --nodeps is not understood in combination with the other options

有人建议在回答类似问题时使用 expect,我宁愿避免这样做。这似乎是一个 "difficult to google" 问题 - 我找不到任何东西。

那么,有没有一种方法可以将答案传递给 apt 中的配置,或者防止 apt 拉入邮件客户端,这样会更好——我不打算向 cddb 发送更新。

在 docker 容器中安装 apt 包的典型模板如下所示:

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    eject \
    vim \
    ruby \
    abcde \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

运行 它与 "noninteractive" 值一起删除任何提示。您不想将其设置为 ENV,因为这也会影响您在容器内 运行 的任何交互式命令。

您还希望在完成后清理包数据库以减小层大小并避免在后续步骤中重复使用陈旧的缓存包数据库。

no-install-recommends 选项将通过仅安装所需的依赖项而不安装额外的推荐包来减少安装的包数量。这对我来说将根文件系统的大小减少了一半。


如果您需要将非默认配置传递给包,请使用 debconf。首先 运行 以交互方式安装某处并输入要保存的选项。安装 debconf-utils。然后 运行:

debconf-get-selections | grep "${package_name}"

查看您为该软件包配置的所有选项。然后,您可以在 运行 安装之前将这些选项通过管道传输到容器中的 debconf-set-selections,例如:

RUN echo "postfix postfix/main_mailer_type        select  No configuration" \
  | debconf-set-selections \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
 ....

或将您的选择保存到您复制的文件中:

COPY debconf-selections /
RUN debconf-set-selections </debconf-selections \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
 ....