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

u59ebvdq  于 2023-04-29  发布在  Docker
关注(0)|答案(8)|浏览(170)

有没有可能以某种方式回答在使用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:

据我所知,我只是不能回答对话框,但有没有某种方法,我可以通过一个参数来回答每个问题提前?我知道这只是更改了一些配置,所以我可以在事后再做,但想必最好让安装脚本来做,这样一切都能得到正确的设置。

jfgube3f

jfgube3f1#

请参阅此处的讨论:https://github.com/docker/docker/issues/4032。简而言之,不建议设置ENV DEBIAN_FRONTEND noninteractive,因为它会持续存在于最终图像中,即使在运行docker run -i -t ... bash之类的程序时也是如此。因此,建议省略DEBIAN_FRONTEND并使用警告,或者为每个命令e明确指定该警告。例如RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q package
幸运的是,新的ARG指令设置了仅在构建期间存在的变量,因此现在可以使用一个更优雅的解决方案,该解决方案在DockerFile中指定,但不会在最终映像中持久化:ARG DEBIAN_FRONTEND=noninteractive

pgky5nke

pgky5nke2#

您应该将DEBIAN_FRONTEND=noninteractive设置为envvar。在大多数情况下,这至少会使安装不会出错。
正如@Azdle提到的,使用debconf-set-selections可以设置特定的项目。

83qze16e

83qze16e3#

像往常一样,再多找一点答案。
答案是debconf-set-selections。手册:http://manpages.ubuntu.com/manpages/oneiric/en/man1/debconf-set-selections.1.html
要查找可以设置的选项,请在已安装该软件包的系统上使用debconf-get-selections。您需要为第二个命令安装debconf-utils

mbjcgjjk

mbjcgjjk4#

ENV DEBIAN_FRONTEND noninteractive不适合我
也没有ARG DEBIAN_FRONTEND=noninteractive
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections做到了

dced5bon

dced5bon5#

这是工作解决方案:
ARG DEBIAN_FRONTEND=非交互式

bakd9h0s

bakd9h0s6#

成功的例子:

echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
sudo apt-get install -y -q <package name>
pgx2nnw8

pgx2nnw87#

ENV DEBIAN_FRONTEND=noninteractive(或遗留语法ENV DEBIAN_FRONTEND noninteractive)有时有效,有时无效的原因与sudo的使用有关。默认情况下,sudo忽略当前用户的环境,并使用干净的环境。这可以通过sudo --preserve-env标志来控制。显然,将此变量添加到每个sudo调用中是很麻烦的,但是通过将环境变量添加到操作系统的/etc/environment文件中,可以很容易地使每个用户的整个系统都是非交互式的。

RUN set -a \
 && eval "$(sudo tee --append /etc/environment <<<'DEBIAN_FRONTEND=noninteractive')" \
 && set +a \
 && sudo apt-get update \
 && sudo apt-get install mail-stack-delivery

快速分析重要的片段:

# export every variable that follows
set -a

# appends the given string to the `/etc/environment` file as root
# tee prints its input to standard out
# eval interprets the output of tee
eval "$(sudo tee --append /etc/environment <<<'DEBIAN_FRONTEND=noninteractive')"

# stop exporting everything
set +a

前面提到过,DEBIAN_FRONTEND=noninteractive不应该以这种全局方式设置。这取决于你的形象的意图是什么。如果它是为自动化而不是为人类设计的,那么在全球范围内设置它是完全可以的。

dfddblmv

dfddblmv8#

添加小包“dialog”也可以解决这个问题。

&& sudo apt-get -y install dialog

相关问题