.dockerignore テスト

.dockerignore パターンを候補パスに対してテストし、含まれるファイル・除外されるファイルを確認して、正規化されたルール一覧をコピーします。

ブラウザ内でローカルに実行
このツールの処理はすべてブラウザ内で行われます。VoriTools が入力内容をアップロード・保存したり、外部 API に送信したりすることはありません。
ルールと候補パスパターンとパスはローカルでテキストとして評価されます。VoriTools がリポジトリや Docker コンテキストを読み取ることはありません。

候補パスに対して .dockerignore のルールをテストする方法

左の欄に .dockerignore ファイルの内容を、右の欄にビルドコンテキスト直下からの相対パスを 1 行ずつ入れます。「ビルドコンテキストをテスト」を押すと、各候補が除外か対象かのどちらかに判定され、決め手になったルールと、一致が親フォルダーによる場合の注記が付きます。右側には Docker が実際に読む正規化済みのルール一覧と、よくあるビルドコンテキストのリスクのレポートも表示されます。

.dockerignore は、Docker クライアントがビルドコンテキストから外すファイルを指定するものです。ビルドコンテキストとはデーモンへ送られるツリーで、ADD と COPY が参照できる範囲でもあります。このページが読むのは入力されたテキストだけで、リポジトリを開いたり、実際のコンテキストフォルダーを走査したり、ビルドを実行したりはしません。以下は、このページが適用する一致規則(Docker の実装に合わせたもの)についての説明です。

  1. 「.dockerignore ルール」の欄に、1 行 1 パターンでファイルの内容を貼り付けます。先頭の文字が # の行はコメントで、! を付けると例外になり、そのファイルを対象に戻せます。
  2. 「候補パス」の欄に、確認したいパスをコンテキスト内での見え方のまま 1 行ずつ書きます。例: src/index.js、node_modules/react/index.js、.env。
  3. 「ビルドコンテキストをテスト」を押します。各候補には除外または対象のラベルが付き、決め手になったルールが示されます。上位のフォルダーが理由の場合は「除外 · 一致: node_modules(親フォルダー)」のように表示されます。
  4. 「正規化された .dockerignore」の欄を読みます。コメントと空行は消え、./x、a//b、a/../b、末尾の / は整理され、先頭の / も取り除かれるため、Docker が読む内容がそのまま見えます。
  5. 結果一覧でよくあるリスク — .git、node_modules、.env と秘密鍵、全体を除外するルール、どの候補にも一致しなかったルール — を確認し、変わったパターンは実際にビルドで使う Docker のバージョンで再確認します。候補リストは実際のコンテキストの一部にすぎません。

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 が失敗します。コピー元のパスも合わせて確認してください。

最近使ったツール: