aptでパッケージをインストールするときにstdINを回避する


y を何度も生成する専用の Unix コマンドがあることをご存知ですか?または、パッケージをインストールまたは更新するときに、apt パッケージ マネージャーを完全に非対話型にすることができますか?

私は最近、いくつかのパッケージとマニュアル ページを Ubuntu Docker イメージにインストールするときにこのプロセスを実行したので、参考のために簡単な宣伝文句を書くことにしました.


これが私が始めたDockerfileです:

FROM ubuntu:latest

WORKDIR /app

RUN apt-get update && apt-get install -y \
    openssl \
    curl \
    git \ 
    vim \
    dnsutils \
    man-db

CMD ["bash"]


残念ながら、このコマンドは dnsutils がタイムゾーン地域に関する情報を集約しようとするため失敗します.このため、単に -y を追加して、それを良いと呼ぶことはできませんでした.いくつかのグーグルの後、私は DEBIAN_FRONTEND=noninteractive に出くわしました.これは、 apt を使用してパッケージを更新またはインストールする際にゼロ操作を強制します.すべての質問に対するデフォルトの回答を受け入れます.これは、Dockerfiles、スクリプト、および他の何百万ものことで非常に役立つ可能性があります.したがって、これを念頭に置いて、これを環境変数として含めるように 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

CMD ["bash"]


出来上がり!最初のステップは解決しました.


ただし、この Docker イメージには、デフォルトで man ページというもう 1 つのものが必要でした.これらを取得するには、unminimize を実行してすべてのページを展開する必要があります.残念ながら、デフォルトでは unminimize -yunminimize --yes も機能しませんでした.

さらにグーグルで調べた後、信じられないほど単純な yes Unix バイナリに出くわしました.たとえば、端末で y を実行するだけで、yes が無限にスパムするのを見ることができます.

この場合、y を追加して、すべてのデフォルトを受け入れ、パッケージのインストールを実行します.これは、RUN yes | unminimize を何度もコマンドにパイプすることです.そしてちょうどそのように、いくつかのネットワーキング、マニュアルページ、およびデフォルトで動作するその他のものでスピンアップできる動作する Docker イメージがあります!

最終的な 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"]


そして、次のようなもので実行できます: y