JenkinsとかでDockerコンテナを使ってテスト等を実行する時にdocker buildのキャッシュが効かない件

Dockerfileを使ってdockerイメージをビルドする時、COPYとかでリソースを追加する際、追加するリソースが変更されていなければキャッシュが使われてズババッとビルドされる。
が、リソースを変更していないにもかかわらず何故かキャッシュが使われず、結果として本来ならスキップできるはずの命令が実行されてしまいイメージのビルドにむっちゃ時間かかるみたいな現象があった。
Jenkinsとかでって書いたけど別にJenkinsに限らない。

原因

キャッシュ利用判断はリソース内容の変更を見ているんだけど、多分内容を見る前にファイルのmtimeを見ていて、それが変わっていれば内容を見ずに「変更されている」とみなしている。
gitはファイルのmtimeを保持しないので、ビルド対象リソースをcloneしてくると常に今作られたファイルみたいになってしまってキャッシュが使われない

対策

git-set-mtimeを使う(git-set-mtime を Docker のためにリリースした - 鳩舎)
これを使うとファイルのmtimeをgitのコミット日時に設定してくれるので幸せになれる。

まとめ

そもそもこのエントリに書いてある内容自体が Docker のキャッシュは mtime ベースっぽい - 鳩舎 以上の事を含んでないのであまり意味のないエントリだった。
git-set-mtimeのおかげで生きるのが楽しくなりました、id:rosylilly さんありがとうございます!