Reputation: 2329
Is it possible to somehow answer the questions that are presented as dialogs when installing some packages using apt-get?
For instance I'm trying to setup a container containing the mail-stack-delivery
package with:
FROM ubuntu
RUN apt-get install -y mail-stack-delivery
However that dockerfile generates dozens of errors when built that are along the lines of:
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:
From what I understand I just simply can't respond to the dialogs, but is there some way that I can pass a parameter to answer each question in advance? I know that it's just changing some configurations, so I could do it after the fact, but presumably it's better to let the install scripts do it so everything gets set properly.
Upvotes: 108
Views: 59163
Reputation: 1
My problem was that a debconf package needed me to accept a EULA, so setting the frontend to noniteractive did not work. Setting ARG DEBIAN_FRONTEND=readline
did the trick, together with using an expect script to handle all dialog questions and EULA acceptance.
Upvotes: 0
Reputation: 19
Installing a (small) package compatible with "dialog" feature will clear the "can't find a dialog-like program" error when installing other packages in an interactive way:
sudo apt-get install whiptail
It worked for me.
Upvotes: 0
Reputation: 101
Adding the tiny package 'dialog' also resolves this issue.
&& sudo apt-get -y install dialog
Upvotes: 2
Reputation: 16253
The reason why ENV DEBIAN_FRONTEND=noninteractive
(or the legacy syntax ENV DEBIAN_FRONTEND noninteractive
) sometimes works and sometimes does not has to do with the usage of sudo
. By default sudo
ignores the environment of the current user and uses a clean one. This can be controlled via the sudo --preserve-env
flag. Obviously adding this to every sudo
invocation is cumbersome, but it is easy to make the entire system for every user non-interactive by adding the environment variable to the /etc/environment
file of the operating system.
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
Quickly dissecting the important snippet in isolation:
# 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
It was mentioned before the DEBIAN_FRONTEND=noninteractive
should not be set in such a global fashion. This depends on what the intend of your image is. If it is meant for automation and not for humans then it is totally fine to set it globally.
Upvotes: 1
Reputation: 117
EXAMPLE With Success:
echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
sudo apt-get install -y -q <package name>
Upvotes: 9
Reputation: 18184
ENV DEBIAN_FRONTEND noninteractive
didn't work for me
neither did ARG DEBIAN_FRONTEND=noninteractive
but
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
did
Upvotes: 14
Reputation: 38106
See the discussion here: https://github.com/docker/docker/issues/4032. In short, setting ENV DEBIAN_FRONTEND noninteractive
is not recommended as it persists in the final image, even when running something like docker run -i -t ... bash
. Therefore it is recommended either to omit DEBIAN_FRONTEND
and live with the warning, or specify it explicitly for each command e.g. RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q package
.
Fortunately, the new ARG
directive sets variables that only live during the build so a more elegant solution is now possible that's specified in the DockerFile
yet does not persist in the final image: ARG DEBIAN_FRONTEND=noninteractive
.
Upvotes: 126
Reputation: 5993
You should set DEBIAN_FRONTEND=noninteractive as an envvar. In most cases this will at least make it so the installation doesn't error out.
Also as @Azdle mentioned, using debconf-set-selections will let you set specific items.
Upvotes: 26
Reputation: 2329
As usual, a little more searching found the answer.
The answer is debconf-set-selections
. Manpage: http://manpages.ubuntu.com/manpages/oneiric/en/man1/debconf-set-selections.1.html
To find the options that can be set use debconf-get-selections
on a system that already has the package installed. You'll need to install debconf-utils
for the second command.
Upvotes: 19