前提
- 開発PC
- Mac
- 開発動作環境
- docker上のコンテナ
- ソースの同期方法
- hostのソースがあるディレクトリをdockerにmountして同期していた。
発生した問題
- docker上で動いたphpファイルがサーバー(amazon linux)にデプロイした際にその読み込んでいるファイルがないと言うエラーが出て動かなくなってしまった。
原因
- ファイルの大文字小文字をtypoしていたため、そんな名前のファイルはないと怒られた。
コード例
- 同じディレクトリに
index.php
とTest.php
と言うファイルがある想定 - index.php 正しいやつ
require_once 'Test.php';
echo 'hogehoge';
- index.php typo
//ここのファイル名をtypo
require_once 'test.php';
echo 'hogehoge';
- Test.phpの内容
echo "test ";
出力結果
- docker
- 動く。
test hogehoge
- サーバーでの出力
- サーバーではそんなファイルは読めないと怒られる。
Warning: require_once(Test.php): failed to open stream: No such file or directory in /home/www-data/public/index.php on line 4
Fatal error: require_once(): Failed opening required '.Test.php' (include_path='.:/usr/local/lib/php') in /home/www-data/public/index.php on line 4
原因追求
- 原因がわかったのは良いけど、ローカルで大文字小文字区別しない状態でのエラーは怖いなーと原因調査
結論
- macからhostからmountしたディスクが
case-insensitive
だった。
調査
- dockerのコンテナに入って
df -T
を実行してファイルシステムを確認したら、mountした/var/www/app
がosxfs
になっていてmacの標準が大文字・小文字を区別しないのが原因だった。 - コマンド結果
解決方法
- case-sensitiveなボリュームを新たに切って、ソースをそこからmountするように変更すれば良いのかもしない(未実施)
- でももっといい方法ありそうだなー誰か教えてください。
余談
- mountしているだけなら当たり前といえば当たり前なんだけどもdockerだから大丈夫やろーと思ってので盲点だった。
- ただadobe製品とかはcase-sensitiveだと動かないとか、逆にcase-insensitiveじゃないと動かないものもたくさんあるらしい・・・怖い。
参考URL
- File system sharing (osxfs)
- 大文字小文字区別ファイルシステムから区別しないファイルシステムへ
- Mac OS X ファイルシステムの確認方法と大文字と小文字を区別するファイルシステムについて