Laravel Sail permission denied の解決方法
Laravel Sailで開発中に発生するパーミッションエラーの回避方法を説明します。
ブラウザに 「laravel.log がpermission denied」 と表示される現象です。
目次
動作環境
- Windows11 22H2
- WSL2
- Ubuntu 22.04.02 LTS
- Laravel 10
- Docker version 23.0.5
- Docker Desktop v4.19.0
Laravelは、”curl -s https://laravel.build/app-name | bash” で、インストール。
現象
Laravel Sailの起動後にブラウザでアクセスするとエラー表示される。
“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: The stream or file ~~~”
原因
ファイルを開く権限がありません。
作成されたLaravelのファイルの所有者が「root」になっています。root以外のユーザーはファイルを書き込む権限がありません。
対応策
対応策は3つあります。
- Laravelディレクトリ・ファイルの所有者の変更
- エラー対象のディレクトリ・ファイルのパーミッションの変更
- 一般ユーザーでLaravelをインストールする
①Laravelディレクトリの所有者を変更します
cd laravel-app
sail up -d
sail root-shell
chown sail:sail . -R
exit
所有者を変更後にブラウザでアクセスするとエラーが無くなったこと確認できます。
説明
cd
コマンドでLaravelをインストールしたディレクトリに移動しますsail up -d
で、Sailを起動します。起動コマンドのエイリアスを設定していない場合はvendor配下のコマンドを実行してください。'./vendor/bin/sail up' or './vendor/bin/sail up -d'
sail root-shell
で、コンテナ側にルートでログインします。ログイン後に、ls -la
などでファイルを確認すると所有者がrootであることを確認できますchown sail:sail . -R
で、ファイル所有者をsailに変更します。「-R」オプションは再帰的に実行しますcat /etc/passwd
などで、コンテナ側にsailユーザーが存在することを確認できます。
②エラー対象のディレクトリ・ファイルのパーミッションを変更します
誰でも書き込めるように権限を緩くします。
chmod -R 777 ./storage/
WSL2側で実行しています。エラーが発生したディレクトリ、ファイルに対してパーミッションを変更します。
この後も開発が進んでいくとパーミッションのエラーが発生しますので、そのつど対象のディレクトリ、ファイルのパーミッションを変更していきます。
③一般ユーザーでLaravelをインストールします
一般ユーザでLaravelをインストールするとパーミッションのエラーは発生しません。
どうやら、WSL2(Ubuntu)インストール時に、一般ユーザを作成するのがデフォルトのようなのですが、私はそのような画面やプロンプトを覚えていません。そのままrootで学習を続けてしまいました。
なので、本件のようなトラブルに被ったようです。ひょっとしたら私だけなのかな?
Linuxでは、rootで作業することは限られていることでしょう。一般ユーザで日々の作業するのが常識です。
では、一般ユーザーを作成してLaravelをインストールする方法です。
まずは、root権限で実行します。userを作成します
adduser user0602
usermod -aG sudo user0602
usermod -aG docker user0602
一般ユーザーに移行してLaravelをインストールします。
Docker Desktopは起動しておきましょう。
su - user0602
curl -s https://laravel.build/app01 | bash
説明
adduser username
: ユーザーを追加します- パスワードを入力する
- informationの入力は全部returnでもよい
usermod -aG group user
: ユーザをグループに追加する- -aG : -Gはグループを置き換える、-aGでグループ追加となる。
usermod -aG docker username
: dockerのコマンドの実行権限を与えるためdockerグループに追加するsu
: ユーザーを切り替える。su -
: 環境も移動
Linuxコマンド
使うかも
- cat /etc/passwd : ユーザー一覧
- cat /etc/group : グループ一覧
- id : ユーザー、グループの確認
- id username : ユーザー、グループの確認
- sudo ~ : root権限で実行
参考資料
site/blog
【超入門】Laravel とは?できること・基本をわかりやすく解説
Docker 環境で Laravel を動かしたらエラーが発生した話
Laravel sail up throws Permissions denied error