Docker命令需要键盘交互
我正在尝试创build一个用于翻录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”拉入邮件客户端(不知道哪个),并试图通过询问要configuration什么types的邮件连接(智能主机/中继等)来configuration。
当docker运行时,它不会从stdin读取,所以我不能redirect到docker进程。
我已经尝试使用--nodeps
apt(并用apt-get代替apt); 不幸的是 – --nodeps
似乎不再是一个支持的选项,并返回:
E:命令行选项–nodeps不能与其他选项结合使用
有人build议使用expect来回应类似的问题,我宁愿避免。 这似乎是一个“难以谷歌”的问题 – 我什么都找不到。
那么,有没有办法在apt中传递configuration的答案,或者阻止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/*
使用“非交互”值运行它将删除任何提示。 您不希望将其设置为ENV
因为这也会影响在容器中运行的任何交互式命令。
还需要在完成后清理包数据库,以减less图层大小,并避免在稍后的步骤中重新使用过时的caching包数据库。
no-install-recommends选项将通过仅安装所需的依赖关系来减less安装的软件包数量,而不是额外推荐的软件包。 这为我减less了一半的根文件系统的大小。
如果您需要将非默认configuration传递给包,请使用debconf。 首先运行你交互安装的地方,然后input你想保存的选项。 安装debconf-utils
。 然后运行:
debconf-get-selections | grep "${package_name}"
查看为该软件包configuration的所有选项。 然后,您可以在运行安装之前debconf-set-selections
这些选项传递给容器中的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 \ ....
或将您的select保存到您复制的文件中:
COPY debconf-selections / RUN debconf-set-selections </debconf-selections \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ ....