【Docker】mutagen-composeのignoreオプションは「.」を指定できない
はじめに
mutagen-composeのignoreオプションについて、間違った内容の記事が検索上位に表示されており、現状ignoreオプションについて解説した記事がほとんどなかったので、注意喚起を含め記事を書くことにしました。
mutagen-composeとは
mutagen-composeはローカル/リモート間のファイル同期を高速で行うmutagenというOSSをDockerのホスト/コンテナ間でも使えるようにしたものです。似た用途としてdocker-syncとよく比較されています(詳しくは公式docsや参考記事をご覧ください)
ignoreオプションについて
公式docs
ignoreオプションを使うことにより、特定のディレクトリやファイルを同期対象から外すことができます。
ignoreオプションをdefaultで使用すると全セッションに設定が反映されます。またdefault以外にもセッションごとにオプションを設定することもできます。
同期対象から外すために、ignoreのpathsにディレクトリ/ファイルのパスを渡す必要があるのですが、この際のパスパターンマッチングは公式docsにある通り、doublestarというOSSが使用されています。
sync:
defaults:
ignore:
paths:
- "<ignore1>"
- "<ignore2>"
- ...
ignoreオプションのpathsは「.」を指定できない
他の記事で間違いが見受けられたのがこの点ついてです。
paths:
- "./hoge.txt" #.を使ってもignoreされない
ignoreオプションのpathsは.
を使ってパスを指定することができません。また.
を使って指定した場合、ignoreされないだけで、何かのエラーを返すこともないので問題に気付きにくいです。
doublestarのREADME抜粋:
Like io/fs.Glob(), patterns containing /./, /../, or starting with / will return no results and no errors. This seems to be a conscious decision, even if counter-intuitive. You can use SplitPattern to divide a pattern into a base path (to initialize an FS object) and pattern.
READMEを読むと「 .
や..
が含まれていたり、/
から始まるパスは結果もエラーも返しません 」と書かれています。
補足1:ディレクトリごとignoreするためには「*」を使う
pathsにディレクトリのパスを渡すだけではディレクトリごとignoreしてくれません。ディレクトリごとignoreするためにはディレクトリ名/*
と記述する必要があります。
paths:
- "hoge_dir/*" #hoge_dirより下が同期対象外
- "hoge_dir/**" #**と記述することでhoge_dirも同期対象外になる
補足2:渡したパスと複数マッチするものがあった場合は全てignoreされる
このようなディレクトリ構造になっていた場合
.
├── hoge.txt
└── fuga_dir
└── hoge.txt
以下のようにpathsを設定すると2つのhoge.txtがignoreされてしまいます。
paths:
- "hoge.txt"
まとめ
今回の問題に私自身も結構ハマったので、同じ苦しみを味わう人を出さないよう執筆しました。
この記事が誰かのお役に立てば嬉しいです。
参考記事
Discussion