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 y
endlessly.
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
Top comments (0)