3
1

More than 1 year has passed since last update.

Docker 環境で Laravel を動かしたらエラーが発生した話

Last updated at Posted at 2022-05-18

Docker 環境の Laravel でエラー

Rocky Linux の Docker 環境に入れた Laravel を起動してブラウザから開くとエラーが発生。
image.png

ログファイルを 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 のページが表示されるようになりました。

image.png

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1