Did you know there's an entire Unix command dedicated to generating
y over and over? Or that you can make your apt package manager be completely noninteractive when installing or updating packages?
I recently went through this process when installing some packages and man pages in an Ubuntu Docker image and decided to write up a quick blurb about it for reference.
Here is the Dockerfile I started with:
FROM ubuntu:latest WORKDIR /app RUN apt-get update && apt-get install -y \ openssl \ curl \ git \ vim \ dnsutils \ man-db CMD ["bash"]
Unfortunately, this command fails because
dnsutils tries to aggregate some information about your timezone region. Because of this, I wasn't able to just add a
-y and call it good. After some Googling, I came across
DEBIAN_FRONTEND=noninteractive, which forces zero interaction while updating or installing packages with
apt. It will accept the default answer to all questions, which can be super useful in Dockerfiles, scripts, and I'm sure a million other things. So with this in mind, I updated the Dockerfile to include this as an environment variable:
FROM ubuntu:latest WORKDIR /app ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ openssl \ curl \ git \ vim \ dnsutils \ man-db CMD ["bash"]
Voila! First step solved.
However, I wanted one more thing in this Docker image by default, which is
man pages. In order to get these, I need to run
unminimize to expand all of the pages. Unfortunately, neither
unminimize -y or
unminimize --yes worked by default.
After some more Googling, I came across the
yes Unix binary, which is incredibly straightforward: it just endlessly types
y. For instance, you can just run
yes in your terminal and watch it spam
In this case, I added
RUN yes | unminimize to accept all of the defaults and run through the package installation, which is piping in
y over and over to the command. And just like that, I have a working Docker image that can be spun up with some networking, man pages, and other stuff working by default!
Here is the final Dockerfile:
FROM ubuntu:latest WORKDIR /app ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ openssl \ curl \ git \ vim \ dnsutils \ man-db RUN yes | unminimize CMD ["bash"]
And it could be run with something like this:
docker build -t shannon:v0; docker run -it shannon:v0