Docker 環境の Laravel でエラー
Rocky Linux の Docker 環境に入れた Laravel を起動してブラウザから開くとエラーが発生。
ログファイルを append mode でオープンできないようです。
The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode:
Failed to open stream:
Permission denied The exception occurred while attempting to log:
Docker コンテナが参照しているホスト側ディレクトリの所有者を確認。root が所有者となっています。コンテナ内からは sail ユーザーでアクセスしているので書き込みできません。
# ls -al [project_dir]/storage/
合計 4
drwxr-xr-x. 5 root root 46 5月 18 13:43 .
drwxr-xr-x. 13 root root 4096 5月 18 13:35 ..
drwxr-xr-x. 3 root root 38 5月 6 04:52 app
drwxr-xr-x. 6 root root 81 5月 6 04:52 framework
drwxr-xr-x. 2 root root 43 5月 18 14:24 logs
対策(非推奨)
以下、全てホスト側からの操作となります
コンテナ名を調べる(NAMES列)
$ docker ps
コンテナ内の sail ユーザーの UID を調べる
$ docker exec -it [コンテナ名] /usr/bin/grep sail /etc/passwd
sail:x:[UID]:0::/home/sail:/bin/bash
storage ディレクトリの所有者を sail に変更する
$ chown [UID] [project_dir]/storage/ -R
※logs ディレクトリだけ所有者変更すると後ほど別のエラーも発生するので上位の storage ディレクトリから変更しました
対策(推奨)
テスト環境ということで root ユーザーにてコンテナの作成 curl -s "https://laravel.build/example-app" | bash
をしていたのが良くなかったようです。
一般ユーザーで環境を作り直すことでエラーが出なくなりました!!
一般ユーザーですとコンテナ内の sail ユーザーの UID はホストのユーザーの UID と同じものがセット
されます。これで同じ所有者となるため storage/logs に読み書きが可能となります。
なぜ root ユーザーが NG なのか?
ホストで root ユーザーにて Laravel の Docker コンテナを作るスクリプトを実行
↓
上記スクリプトでコンテナに sail ユーザーを作成するが、このときホストのユーザーの UID と同じものをセットしようとする
↓
ところがホストのユーザー(root)の UID は 0
↓
これはコンテナ内の root でも割り当て済みなので使えない。そのため他の UID をセットする
↓
結果、コンテナの sail ユーザーの UID がホストのユーザーの UID と異なってしまい、参照先ディレクトリの所有者とみなされず書き込み権限が与えられない
動作確認
再度ブラウザからアクセスすると正常に Laravel のページが表示されるようになりました。
sail ユーザーとは
コンテナ内のプロセスを確認してみると PHP の Web サーバーを起動しているプロセスの所有者は sail であることが分かりました。
そのため storage ディレクトなどに sail ユーザーが読み書きできる権限が必要となるのです。
環境によっては sail とは異なるユーザーで PHP が動作している可能性もありますので、ユーザー名は適宜確認してみてください。
docker exec -it [コンテナ名] /bin/ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 4360 3216 ? Ss 05:13 0:00 bash /usr/loc
root 10 0.0 1.1 33144 22232 ? S 05:13 0:00 /usr/bin/pyth
sail 11 0.0 2.7 123196 50172 ? S 05:13 0:01 /usr/bin/php
sail 18 0.0 2.8 236460 52948 ? S 05:13 0:01 /usr/bin/php8
root 87 0.0 0.0 7060 1588 pts/0 Rs+ 06:00 0:00 /bin/ps -aux