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

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

当docker运行时,似乎没有从stdin中读取内容,因此我无法重定向到docker进程中.

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

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

有人建议使用Expect来回答类似的问题,我宁愿避免.这似乎是“难以使用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 \
 ....

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...