【问题标题】:Docker commands require keyboard interactionDocker 命令需要键盘交互
【发布时间】:2023-10-23 23:57:01
【问题描述】:

我正在尝试创建一个用于翻录 CD 的 Docker 映像(使用 abcde)。 这是 Dockerfile 的相关部分:

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

不幸的是,包“abcde”引入了一个邮件客户端(不确定是哪个),并且 apt 尝试通过询问要配置的邮件连接类型(智能主机/中继等)来配置它。

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

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

E: 命令行选项 --nodeps 无法与其他选项结合使用

有人建议使用 expect 来回答类似的问题,我宁愿避免。这似乎是一个“很难用谷歌搜索”的问题——我什么都找不到。

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

【问题讨论】:

  • 通常,在 docker build 的上下文中,apt 安装是非交互式的(因为没有 tty)。设置 DEBIAN_FRONTEND=noninteractive(例如,在安装包之前通过 Dockerfile 中的 ENV 语句)是否会阻止包提示?
  • @larsks- 谢谢,但遗憾的是没有区别。哦,等等——只要正确阅读你的评论;让我试着把它放在 Dockerfile 中......这行得通,所以谢谢!但是:一般的答案呢 - 这对于 apt 命令非常有用,但是一般来说我需要从文件中重定向答案呢?
  • @Dan Lowe:感谢您的编辑,但我不与任何人争论 - 建议使用不同的开膛手的答案并不能解决一般问题,这就是我要提出的观点。
  • @GrahamNicholls 我没有做那个编辑,我之前的编辑做了那个编辑。您可以点击“edited ... ago”链接查看完整的编辑历史记录。
  • @DanLowe OIC,对不起!

标签: docker interactive apt


【解决方案1】:

在 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 \
 ....

【讨论】:

  • 谢谢——顺便说一句,我读到 apt 现在取代了 apt-get(我相信这是有充分理由的)。大概这个建议仍然适用?另外,大概设置 ENV 变量只会影响那些尊重“DEBIAN_FRONTEND”的命令?但是,我仍然更喜欢使用仅为命令设置变量的格式 - 它看起来更干净。 PS很好地抓住了apt clean。
  • 我以前的apt-get 习惯很难改掉,我没有检查过apt 是否改变了这些,但我对此表示怀疑。 ENV 会影响使用该变量的任何命令,包括构建映像后在容器内运行的交互式命令。在构建之后定义这个变量对于图像的用户来说是非常不直观的。
  • 我刚洗完澡,顿悟到通过使用 ENV,var 将被设置在容器中。正如你所说,这会产生意想不到的后果。