Docker for Mac に潜む罠？ ファイル名の大文字・小文字の区別

（先日投稿した内容に誤りがあったので、修正しての再投稿です。）

実はよく分かってないので、走り書き程度となりますが、Docker for MacでPHPアプリの開発を進めていて罠にはまったかもしれないので、ここに書いておきます。

英語が分かる人はたぶんこっちを読んだ方が早いです。
https://docs.docker.com/docker-for-mac/osxfs/


>Case sensitivity

>With Docker for Mac, file systems are shared from OS X into containers in the same way as they operate in OS X. As a result, if a file system on OS X is case-insensitive that behavior is shared by any bind mount from OS X into a container. The default OS X file system is HFS+ and, during installation, it is installed as case-insensitive by default. To get case-sensitive behavior from your bind mounts, you must either create and format a ramdisk or external volume as HFS+ with case-sensitivity or reformat your OS root partition with HFS+ with case-sensitivity. We do not recommend reformatting your root partition as some Mac software dubiously relies on case-insensitivity to function.


# コンテナ内のPHPで大文字・小文字の区別周りで謎の挙動

CentOS7をベースにしたPHPが組み込まれているコンテナを使ってPHPアプリケーションの開発をしていたところ、一緒に開発している仲間から「とあるクラスが無い」というエラーが出るという報告がありました。調べたところ、クラス名の表記が大文字と小文字で間違っていました。ただ、私の環境では問題なく動きます。その方はCentOS7上で直接開発していたのですが、私もCentOS7ベースのコンテナを使って開発していたので？？？でした。

でも当然ながらピュアなCentOSの挙動が正しいと思いますし、**これはDocker for Mac側に罠が潜んでいる**と察しました。このままだと**Docker for MacでPHPの開発しても大文字、小文字のミスが発見できないのでとても危険！！！！**

**キャー、怖い！！！**

# 原因を調査する

PHPでは通常はクラス名の大文字・小文字は区別しないようなので、ここは直接の原因ではなく（間接的にはからんでそうですが）、おそらくファイルシステムの方に原因があるのではないか？と考え、コンテナ内で色々コマンドを叩いてみました。

```
# df -T
```

<img width="761" alt="大文字小文字チェック1.png" src="https://qiita-image-store.s3.amazonaws.com/0/104477/85d8099b-37ae-a5a7-918d-c8996af664ef.png">

aufs？？？ osxfs？？？？ ふーん。よく分からん。

PHPのソースコードを置いてあるのは /var/www 以下なので ext4 じゃないのか？

/var/www 以下の領域で以下をためす

```
# touch test.txt
# touch Test.txt
# ls -al
```

<img width="555" alt="名称未設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/104477/887feb1d-1fbd-4dfd-4d24-8aa5f5de81ea.png">

あちゃー、大文字と小文字を区別してないー　良くわかんねーな…　
**OSXからも見えるようにdocker-composeのvolume機能でマウントしてる（File system sharing）のが影響してそうな気はします。（要検証）**

# 手っ取り早く解決する

開発は佳境。**かといって、この状況を放置するのも怖いので手っ取り早くさくっと対応したい。**

当てずっぽうですが、**デフォルトでは大文字、小文字を区別しないMacのファイルシステムHFS+が影響していると決めつけて**、別論理ボリュームを新しく切って、大文字、小文字を区別できるようにフォーマットにしました。

<img width="583" alt="大文字小文字チェック2.png" src="https://qiita-image-store.s3.amazonaws.com/0/104477/bed044a7-95f2-5c1c-ec73-ebadbecc7985.png">

どうでも良いですが、「CS」は「Case Sensitive」の略です。

PHP上でエラーが出なかった方の論理ボリュームからそのままファイルまるっとをコピーして同様にコンテナを立ち上げて確認したところ…

```
# touch test.txt
# touch Test.txt
# ls -al
```

<img width="555" alt="名称未設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/104477/9513430a-8f2a-0e74-5478-8d636c916d9e.png">

うん、ちゃんと二つファイルがある。

PHPでエラーが出なかったところを確認すると…、

<img width="571" alt="名称未設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/104477/19289c69-904b-d3a7-131e-ede864df3d10.png">

一部マスクをかけてあり見にくいですが、「クラスがありません」というエラーが正しく出ました。

~~**これで安心してPHPのクラス名で大文字、小文字を間違えられる！！！**~~

#### ※注意

そんな人いないとは思いますが、Macのシステムがあるボリュームで大文字、小文字を区別するフォーマットにするのはおそらく危険ですのでやめましょう。少なくともAdobeのソフトウェアはサポートしてないようです。

「大文字と小文字が区別されるドライブへのインストールはサポートされていません」エラー
https://helpx.adobe.com/jp/creative-suite/kb/cq05121953.html

# 結論

**Docker for Mac を使う場合はファイルの大文字、小文字問題に注意せよ！！ 安全に利用するにはホスト側の論理ボリュームが大文字、小文字を区別できる環境で利用するべし**

もう少しスマートな解決方法をご存じの方は教えて頂きたいです。

ただ、大文字、小文字を区別する論理ボリュームで開発した方が間違いは起きにくい気がしますし、本番環境がLinuxであればその環境に近づけることになります。これといったデメリットもないと思うので、気になる方はやっておいて損はないかと思います。

# おまけ（追記あり）

大文字、小文字を区別するようにしたとたん、PHP Stormを起動した瞬間にエラー吐くようになった…

```
idea.case.sensitive.fs=true
```

にせよ、と。

Android Studioで"Filesystem Case-Sensitivity Mismatch"エラーを回避する
http://qiita.com/kinneko/items/7f8a4292377e0164e9cf

をヒントに解決させた。

（追記その1：以下の方法はPhpStorm 2019までの方法 / 2020以降は追記その2を参照してください）

```
$ echo "idea.case.sensitive.fs=true" > mac-idea.properties
$ mv mac-idea.properties ~/Library/Preferences/PhpStorm201X.X/idea.properties
```

だけです。

#### 追記その2

PhpStorm 2020.1から上記の設定ファイルの位置が変わったみたいです。
詳しくはこちらの記事を参考ください

PhpStorm 2020.1からの日本語化は純正のJapanese Language Packプラグインがいいみたい
https://qiita.com/ABE_TAKASHI/items/fc3c5432d22d7b4bcf36

ということで、対応方法が変わります。実は今ごろになってですが、Macの場合はIDE上で直接この設定作業できることに今さら気づきました。

上部メニューから `Help → Edit Custom Properties` をクリックすると、`idea.properties`ファイルを作るかどうか尋ねられるので`Create`を選択し、IDE上にて`idea.case.sensitive.fs=true`を記述しセーブして再起動でこの設定が反映されます。