.dockerignore パターンを候補パスに対してテストし、含まれるファイル・除外されるファイルを確認して、正規化されたルール一覧をコピーします。
ブラウザ内でローカルに実行左の欄に .dockerignore ファイルの内容を、右の欄にビルドコンテキスト直下からの相対パスを 1 行ずつ入れます。「ビルドコンテキストをテスト」を押すと、各候補が除外か対象かのどちらかに判定され、決め手になったルールと、一致が親フォルダーによる場合の注記が付きます。右側には Docker が実際に読む正規化済みのルール一覧と、よくあるビルドコンテキストのリスクのレポートも表示されます。
.dockerignore は、Docker クライアントがビルドコンテキストから外すファイルを指定するものです。ビルドコンテキストとはデーモンへ送られるツリーで、ADD と COPY が参照できる範囲でもあります。このページが読むのは入力されたテキストだけで、リポジトリを開いたり、実際のコンテキストフォルダーを走査したり、ビルドを実行したりはしません。以下は、このページが適用する一致規則(Docker の実装に合わせたもの)についての説明です。
リーダーは 1 行目の UTF-8 BOM を落とし、先頭の文字が # の行は無視し、空行は読み飛ばします。空白の後ろに現れる # はパターンであり、コメントではありません。残った行は前後の空白を除かれ、先頭の ! は例外の印となり、残りはパスのように整理されます。./x は x、a//b は a/b、a/../b は b、foo/ は foo になります。その後、先頭の / が 1 つ取り除かれるため、/foo と foo は同じパターンです。! だけの行はエラーで、Docker は「illegal exclusion pattern」で停止します。
この整理を通らないパターンは、ビルドが始まる前に報告されます。閉じていない [ のクラス、クラス内の位置が正しくない ] や -、バックスラッシュで終わるパターンです。このページは該当する行番号と問題のテキストを示し、ファイルをそのまま通したり、意図を推測したりはしません。
各候補は上から下へパターンと比較され、最後に一致したパターンが判定を決めます。そのため、後ろの例外が前の除外を打ち消せます。パターンはコンテキスト直下からの完全なパスと比較されるので、*.md は直下のマークダウンファイルだけを、**/*.md はすべての階層を対象にします。* と ? は / をまたがず、** はディレクトリをまたぎます(a/**/b は a/b にも一致し、**/foo は直下の foo にも一致します)。[0-9] や [^a-z] は文字クラスで、バックスラッシュは次の文字をエスケープします。
一致したフォルダーの中身もまとめて判定されるため、node_modules は node_modules/react/index.js を除外します。結果ではこれが親フォルダーの注記として明示されます。判定は最後に一致したルールだけで決まるので、何も除外されていない状態で到達した ! 行は何も戻せず、レポートはそうした効果のない行を一覧にします。
判定はテキストに対する判定です。リポジトリを走査しないため、候補リストにないファイルは調べられず、候補リストは実際のコンテキストそのものではなく一部です。Docker のバージョンによってコンテキストの転送や絞り込みの細部が異なるため、変わったパターンは実際に使うクライアントで確認する価値があります。
.dockerignore が左右するのは、クライアントがデーモンへ送る内容だけです。それ自体でイメージレイヤーを作ることはなく、実行時のマウントにも影響せず、ビルド時に COPY や ADD が一致する対象も変えません。コンテキストに残ったファイルはコピーでき、除外されたファイルは Dockerfile が期待していると COPY が失敗します。コピー元のパスも合わせて確認してください。