Dockerfile おぼえがき その1

Railsのイメージを構築する際、よく分からないオプションがいくつか出てきたので、自分用のメモです。

こちらの記事のDockerfileがベースになっています。(一部載ってない箇所もあり) techracho.bpsinc.jp

ARGで値がセットされていない定数がある

ARGで定数を宣言しているが、値がセットされていない

ARG RUBY_VERSION
# 後述
FROM ruby:$RUBY_VERSION-slim-buster

ARG PG_MAJOR
ARG NODE_MAJOR
ARG YARN_VERSION

→docker-composeで外から値を渡している。

例(docker-compose.yml)

version: '3.7'
services:
  sample:
    build:
      context: ./sample
      args:
        - PARAMETER=${PARAMETER}

docker-composeから環境変数をDockerfileに渡す方法 - Qiita

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUNコマンドの途中でビルドがコケた際に処理を終了し、不要なイメージが生成されなくなるオプションのよう。

Dockerfileでの|(パイプ)の扱い - Qiita

bashシェルスクリプトの記述の仕方に関するメモ書き - Qiita

bash -o pipefail / set -o pipefail パイプでつないだ各コマンドの中で終了ステータスが0以外(正常終了以外)だった場合に、最後に0以外だったコマンドの終了ステータスが返されます。

apt-get update -qq

# 共通の依存関係
RUN apt-get update -qq \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    build-essential \
    gnupg2 \

Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2.

-q = quiet
進捗用のインジゲータでなくログ出力に適した形で表示するらしい。

Note that quiet level 2 implies -y;

qは2つまで重ねることが可能。-qqと書くことでレベルが上がり更に表示が簡略化される。 この時-yオプションも有効になり、コマンドの質問は自動的にyesで進められるため要注意とのこと。

apt-get(8) — apt — Debian unstable — Debian Manpages

DEBIAN_FRONTEND=noninteractive

apt-get時に宣言されている箇所。

この文脈でなぜフロントエンド??と思ったけど、インストーラから見たインターフェースの事を指すらしい。
パッケージのインストール時にy/N?とか聞かれる箇所を指すのかな?
こちらをnoninteractiveとしておくことで、無視してもよいエラーを予め非表示にできる。

なぜ Dockerfile で DEBIAN_FRONTEND=noninteractive なのですか? Docker イメージを DebianUbuntu 上で構築する時、次のようなエラーがでることがあります。 unable to initialize frontend: Dialog イメージの構築時、これらのエラーが出ても処理を中断しませんが、インストール時のプロセスでダイアログ・ボックスを表示しようとしても、実行できなかったという情報を表示しています。通常、これらのエラーは安全であり、無視して構いません。

Dockerfile の中で環境変数 DEBIAN_FRONTEND を変更して使い、これらエラーの回避のために使っている方がいます。 これはインストール時にダイアログ・ボックスを開こうとして、エラーがあっても停止しないようにします。

よくある質問と回答(FAQ) — Docker-docs-ja 1.11.0 ドキュメント

ただ、Docker公式としては構築時の情報量が少なくなり後の処理で発生する問題を見逃してしまう可能性があるため推奨していないとのこと。

対象のイメージを使おうとする人たちが、ソフトウェアをインタラクティブに設定する時に、インストーラは何らダイアログ・ボックスを表示しないため、問題が起こりうる場合があります。
このような状況のため、 DEBIAN_FRONTEND を noninteractive に指定するのは「お飾り」の変更であるため、私たちはこのような変更を 推奨しません 。

apt-get install -yq --no-install-recommends

同時にインストールすることが推奨(recommends)されているパッケージのインストールを省略する。 あくまで推奨(recommends)のパッケージが対象であり、必須(depends)のパッケージは同時にインストールされるが、一部の機能が使えなくなる可能性があるとのこと。

「推奨パッケージ」の自動的なインストール Debianポリシーマニュアルに基づいて(Debianポリシーマニュアルには「'Recommends' フィールドには、特別な場合でないかぎり一緒に使用されるパッケージが書かれます」とあります)、デフォルトではパッケージマネジメントシステムが「Recommends:」に記述されたパッケージを、「Depends:」に書かれたものと同じようにインストールするようになりました。 もし特定のパッケージでこの動作をさせたくない場合、「apt-get --no-install-recommends」を指定してください。

ただし、この設定を行うと、一部のプログラムでは期待される機能の一部が使えなくなることがあります。

IntrepidReleaseNotes/ja - Ubuntu Wiki