Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker commands require keyboard interaction

I'm trying to create a Docker image for ripping CDs (using abcde). Here's the relevant portion of the Dockerfile:

FROM ubuntu:17.10
MAINTAINER Graham Nicholls <[email protected]>
RUN apt update && apt -y install eject vim ruby abcde
...

Unfortunately, the package "abcde" pulls in a mail client (not sure which), and apt tries to configure that by asking what type of mail connection to configure (smarthost/relay etc).

When docker runs, it's not appearing to read from stdin, so I can't redirect into the docker process.

I've tried using --nodeps with apt (and replacing apt with apt-get); unfortunately --nodeps seems no-longer to be a supported option and returns:

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

Someone has suggested using expect in response to a similar question, which I'd rather avoid. This seems to be a "difficult to google" problem - I can't find anything.

So, is there a way of passing in the answer to the config in apt, or of preventing apt from pulling in a mail client, which would be better - I'm not planning in sending updates to cddb.

like image 322
Graham Nicholls Avatar asked Oct 29 '17 12:10

Graham Nicholls


People also ask

What is interactive mode in docker?

Docker allows you to run a container in interactive mode. This means you can execute commands inside the container while it is still... Read more > start docker container interactively - Stack Overflow.

What is Dockerd command?

The docker run command first creates a writeable container layer over the specified image, and then starts it using the specified command. That is, docker run is equivalent to the API /containers/create then /containers/(id)/start .

What is -- tty in docker?

The -t (or --tty) flag tells Docker to allocate a virtual terminal session within the container. This is commonly used with the -i (or --interactive) option, which keeps STDIN open even if running in detached mode (more about that later).


1 Answers

The typical template to install apt packages in a docker container looks like:

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/*

Running it with the "noninteractive" value removes any prompts. You don't want to set that as an ENV since that would also impact any interactive commands you run inside the container.

You also want to cleanup the package database when finished to reduce the layer size and avoid reusing a stale cached package database in a later step.

The no-install-recommends option will reduce the number of packages installed by only installing the required dependencies, not the additional recommended packages. This cuts the size of the root filesystem down by half for me.


If you need to pass a non-default configuration to a package, then use debconf. First run you install somewhere interactively and enter the options you want to save. Install debconf-utils. Then run:

debconf-get-selections | grep "${package_name}"

to view all the options you configured for that package. You can then pipe these options to debconf-set-selections in your container before running your install, e.g.:

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

or save your selections to a file that you copy in:

COPY debconf-selections /
RUN debconf-set-selections </debconf-selections \
 && apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
 ....
like image 86
BMitch Avatar answered Sep 22 '22 15:09

BMitch