在docker下安装时可以回答对话框问题吗?


77

使用apt-get安装某些软件包时,是否可以以某种方式回答出现在对话框中的问题?

例如,我正在尝试设置包含以下内容的mail-stack-delivery软件包的容器:

FROM ubuntu

RUN apt-get install -y mail-stack-delivery

但是,在构建时,dockerfile会产生许多错误,这些错误包括:

debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7, <> line 11.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin: 

据我了解,我只是无法响应对话框,但是是否可以通过某种方式提前传递参数来回答每个问题?我知道它只是在更改一些配置,因此事后我可以这样做,但是大概最好让安装脚本来做,这样可以正确设置所有内容。

Answers:


78

请参阅此处的讨论:https : //github.com/docker/docker/issues/4032。简而言之,ENV DEBIAN_FRONTEND noninteractive不建议使用设置,因为它会保留在最终图像中,即使运行时也是如此docker run -i -t ... bash。因此,建议要么忽略DEBIAN_FRONTEND并保留警告,要么为每个命令明确指定警告,例如RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q package

幸运的是,新ARG指令设置了仅在构建期间有效的变量,因此现在有可能提供一种更优雅的解决方案,该解决方案在中指定,DockerFile但不会在最终映像中保留:ARG DEBIAN_FRONTEND=noninteractive


我有一个RUN apt-get -y -qq install python-pip php-mbstring php-bcmath消息正在A new version (/usr/lib/php/7.0/php.ini-production.cli) of configuration file /etc/php/7.0/cli/php.ini is available, but the version installed currently has been locally modified显示的提示下正在停止构建dockerfile .... What do you want to do about modified configuration file php.ini... 1. install the new version, 2. keep the local version....添加此env var会忽略提示
shadi

26

您应该将DEBIAN_FRONTEND = noninteractive设置为envvar。在大多数情况下,这至少会成功实现,因此安装不会出错。

就像@Azdle提到的那样,使用debconf-set-selections将允许您设置特定的项目。



7

这是可行的解决方案:

ARG DEBIAN_FRONTEND =非互动


4
你能解释一下你的答案吗?就像为什么它的工作原理,是什么问题等等
利安德Moesinger

1
当然。我有同样的问题。我尝试添加“ RUN DEBIAN_FRONTEND =非交互式apt-get安装”,但收到相同的错误。如果我将RUN DEBIAN_FRONTEND = noninteractive添加到所有apt-get命令中,则它可以正常工作。之后,我添加了“ ARG DEBIAN_FRONTEND = noninteractive”,它就像一个魅力!对不起,我是这里的新手。我可以删除它:)
vovandos

1
一个好的答案不仅可以解决问题,而且可以解释其背后的原因。例如,查看接受的答案。因此,我建议您要么大量编辑答案,并包括一些有关为什么这些命令起作用的背景信息,要么删除它。我知道您的意思很好-但最终我们希望保持高标准。
Leander Moesinger

4

ENV DEBIAN_FRONTEND noninteractive 对我没用

也没有 ARG DEBIAN_FRONTEND=noninteractive

RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections确实


3

成功的例子:

echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
sudo apt-get install -y -q <package name>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.