Docker 命令需要键盘交互

Gra*_*lls 5 apt interactive docker

我正在尝试创建一个用于翻录 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
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

E: 命令行选项 --nodeps 与其他选项组合不理解

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

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

BMi*_*tch 7

在 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/*
Run Code Online (Sandbox Code Playgroud)

使用“非交互式”值运行它会删除任何提示。您不想将其设置为 ,ENV因为这也会影响您在容器内运行的任何交互式命令。

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

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


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

debconf-get-selections | grep "${package_name}"
Run Code Online (Sandbox Code Playgroud)

查看您为该软件包配置的所有选项。然后,您可以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 \
 ....
Run Code Online (Sandbox Code Playgroud)

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

COPY debconf-selections /
RUN debconf-set-selections </debconf-selections \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
 ....
Run Code Online (Sandbox Code Playgroud)