TL;TR
Docer for MacでLinuxなどケース・センシティブなOSをベースにしたコンテナとホストのMacの間でファイル同期をしていると発生するようだ。
解決策としてはMac上にケース・センシティブなボリュームを作成し、それをMacにマウントし、それをコンテナにマウントする。
下記2コマンドで、「あっ」という間にMac上にケース・センシティブなボリュームを作成できる。
hdiutil create -type SPARSE -fs hfsx -size 4g -volname linux linux.hfsx.dmg.sparseimage
hdiutil attach -nobrowse -mountpoint linux linux.hfsx.dmg.sparseimage
背景と問題
エンジニアチーム内や本番・テストなど異なる環境でも、OSやミドルウェアやそれらのバージョンなどを極力同じにするという目的で、うちではDockerコンテナでMac上にローカル開発環境を構築している。新しいメンバーが入っても、コンテナを起動するだけで開発環境の構築ができる。
Mac上のソースコードがあるディレクトリをDockerコンテナ内のWebサーバのドキュメントルートにマウントすれば、ローカルで編集したものがすぐにローカルWebサーバに反映される。・・・はずだったのだが、まぁまぁ頻繁に変更が反映されないことがある。
コンテナをrestartすると反映されるので、発生した場合はそうしていたが、いい加減効率が悪いので直したかった。
変更が反映されていないときにコンテナ内でのファイルを確認すると、変更は反映されている。しかし、ブラウザで見ると反映されていない。
そして、たまたまエラーになっていた時にそのファイル名を見ると、FooBar.php であるはずのファイル名が foobar.php とログには出ている。しかし、コンテナ内をlsコマンドで確認するとFooBar.phpはあってもfoobar.phpは無い。
試しにfoobar.phpをvimで開くと、なんと開けるうえに内容が古いものになっている。そして、FooBar.phpを開くと新しいものになっている。
しかし、やはりfoobar.phpはlsでは出てこない。
原因
コンテナがベースにしているOSがケース・センシティブだが、コンテナ内で使用しているファイルシステム自体はMacのを継承してケース・インセンシティブなのが問題なようだ。コンテナ内のOSはファイル名の大文字小文字を区別する前提で動いているが、使用しているファイルシステムは大文字小文字を区別しない、ということで、Macとコンテナの間でファイルを同期する際にどこかで不整合が発生しているらしい。
発生するときとしない時があったのは、全て小文字のファイル名だと問題にならなかったということだ。
解決策
ケース・センシティブなボリュームを作成する
参考:https://github.com/docker/for-mac/issues/320#issuecomment-315324629
Mac上にケース・センシティブなボリュームを作成し、それをMacにマウントし、それをコンテナにマウントする。
まず、ケース・センシティブなボリュームを作成する。パーティションサイズを変えたりフォーマットしたりと面倒なことは一切ない。下記コマンドで一瞬で4GBのケース・センシティブなボリュームが作成できる。
hdiutil create -type SPARSE -fs hfsx -size 4g -volname linux linux.hfsx.dmg.sparseimage
そしてこれを下記コマンドでMacにマウントして使えるようにする。マウントする場所は -mountpoint
で指定している。
hdiutil attach -nobrowse -mountpoint /Users/hoge/linux linux.hfsx.dmg.sparseimage
マウントしたら普通のディレクトリと同じように使用できる。

ここをコンテナのvolumeとしてマウントすれば、コンテナ内のケース・センシティビティと一致して問題が発生しないはず。
例えばdocker-composeならばこんな感じに。
services:
ctober-web-server:
...
volumes:
- /Users/hoge/linux:/var/www/html:cached
不要になったら
このボリュームが不要になったら下記でunmountできる。
hdiutil eject linux
また、Macを再起動したらまたマウントする必要がある。その時は上記の hdiutil attach
コマンドを実行すれば良い。
ボリュームのサイズを変更する
ディスクイメージの作成後にサイズを大きくしたい場合など、 hdiutil resize
を使用してサイズを変更できる。(自分の場合は、実行は一瞬でなんの画面表示もなかったがボリュームサイズを見てみると変更されていた。)
hdiutil resize -size 8G linux.hfsx.dmg.sparseimage
IDEでの警告
JetBrainsのPhpStormなど使用していると、作成したケース・センシティブなボリュームにあるファイルを編集すると、IDEが認識しているケース・センシティビティとファイルシステムのが違うよ、と警告が表示される。
そんなときは、Help -> Edit Custom Properties でファイルに下記を追加する。
idea.case.sensitive.fs=true
そして、IDEをリスタートすれば適用される。
参考:https://confluence.jetbrains.com/display/IDEADEV/Filesystem+Case-Sensitivity+Mismatch