Macのあるあるネタに引っかかってしまったのでメモっておきます。
事象
ある開発者さんからAWSにデプロイしてほしいと依頼を受けて、受領したDockerfileとCakePHP一式を、ほいほいーっとFargateにデプロイしました。
が、しばらくしてAPIが正常に動かないと連絡をうけたので、エラーログを確認したところ、以下のような出力がありました。
2021-07-28 11:55:33 Error: [Cake\Http\Exception\MissingControllerException] Controller class UserCreate could not be found. in /var/www/html/vendor/cakephp/cakephp/src/Controller/ControllerFactory.php on line 158
Exception Attributes: array (
'class' => 'UserCreate',
'plugin' => NULL,
'prefix' => 'Api',
'_ext' => NULL,
)
Stack Trace:
...
コントローラーが見つからないというなんかすごい初歩的なエラー。。
そして原因調査のために僕のローカルPCのMac(後々聞くと、開発者さんもMacだった)でDocker立ち上げてテストすると正常に動く。。
Dockerってポータビリティがウリなのになぜ環境が変わると動かなくなるの??
原因
コントローラーの子ディレクトリの大文字小文字をミスっていたことでした。
具体的にはCakeのルーティングを
Router::prefix('Api', function ($routes) {
$routes->connect('/user_create', ['controller' => 'UserCreate', 'action' => 'index']);
$routes->connect('/user_get', ['controller' => 'UserGet', 'action' => 'index']);
...
のように設定しており、本来ならディレクトリ名を “Api” とすべきものを小文字の “api” と誤って作成していました。
$ ls -1 src/Controller/
api ・・・ これが誤っていた
## Api ・・・ これが正解
...
そしてMacにあるCakeのプロジェクトディレクトリをdocker-composeでマウントしてました。
services:
...
phpfpm:
build: ./docker/phpfpm
volumes:
- .:/var/www/html ・・・ カレントディレクトリがプロジェクトのルートディレクトリ
...
と、以上が直接的な原因だったのですが、MacのファイルシステムAPFS(Apple File System) が、(デフォルトでは)大文字小文字の区別をしないため、ローカル環境で正常に稼働できてしまうことが、とても話をややこしくしてました。。orz
Tips
ディレクトリ名 “api” を “Api” に修正したものをGitHub にコミットしようとしたら、差分がでませんでした。
gitの以下コマンドで大文字小文字の区別できるようになり、ちゃんと差分が出力されました。
$ git config core.ignorecase false
ちなみに、この大文字小文字区別、冷静に考えるとWindowsも区別してないですね。なのでMac固有云々というよりクライアントPCはまあそういうものなんだと考え直しました。(Linuxサーバみたくコマンド叩いてるとそういう意識薄れますが)
あと大文字小文字区別する設定にすると動かなくなるアプリケーションがあるようなので変更する場合は要注意です。
今回は以上です〜ノシ
参考
(о ̄∇ ̄)/ぁざ~~っす
Docker for Mac に潜む罠? ファイル名の大文字・小文字の区別
Docker Desktop forMacユーザーマニュアル