できない.dev

.dockerignore

別名: dockerignore / dockerignore ファイル / Dockerfile.dockerignore

docker build でビルドコンテキストから除外するファイルを書く設定ファイル。
コンテキストのルートに置き、1 行 1 パターンで指定する。
除外したファイルは COPY / ADD からも見えなくなる。

公開:

定義

.dockerignore は、docker build がビルドコンテキストを builder へ送る前に、除外するファイルやディレクトリを指定する設定ファイル。
ビルドクライアントはコンテキストのルートにある .dockerignore を探し、マッチしたパスを取り除いてから送信する。

詳細

中身は改行区切りのパターンの並びで、Go の filepath.Match の規則に従い、** は 0 個以上のディレクトリにマッチする。
各行は filepath.Clean で整形されるため先頭と末尾のスラッシュは無視され、/foo/bar と foo/bar/ は同じ意味になる。
1 桁目が # の行はコメント。
先頭に ! を付けると除外の例外になり、最後にマッチした行が結果を決めるので順序が効く。
Dockerfile が複数あるときは、Dockerfile の横に build.Dockerfile.dockerignore のような名前で置くと、ルートの .dockerignore より優先される(公式ドキュメント(新しいタブで開く))。

node_modules
**/*.log
!keep.log

よくある誤解

  • Dockerfile と同じ階層に置けば効く: 基準は Dockerfile の場所ではなくコンテキストのルート。docker build -f docker/Dockerfile . なら、Dockerfile 専用のファイルが無い限り ./.dockerignore が読まれる。
  • 転送量を減らすだけで結果は変わらない: 除外したファイルは COPY / ADD の参照元からも消えるため、COPY が失敗する原因にもなる。
  • 除外すれば Dockerfile は送られない: Dockerfile と .dockerignore はビルドに必要なので、除外指定しても builder には送られる。
    変わるのは COPY / ADD でイメージに入れられなくなる点だけ。

関連

効かないときの切り分けは .dockerignore が効かずファイルを除外できない、除外しすぎて失敗する例は COPY でファイルが見つからない を参照。
パターンの考え方は glob も近い。

この記事は役立ちましたか?