JINMUSOFTWARE

Laravel Sail permission denied の解決方法

Laravelのlogoです。

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の起動後にブラウザでアクセスするとエラー表示される。

laravel-permission-error
laravel-permission-error

“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つあります。

  1. Laravelディレクトリ・ファイルの所有者の変更
  2. エラー対象のディレクトリ・ファイルのパーミッションの変更
  3. 一般ユーザーで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権限で実行

参考資料

Laravel 10.x Laravel Sail

site/blog

【超入門】Laravel とは?できること・基本をわかりやすく解説

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

Laravel sail up throws Permissions denied error

関連記事

Laravelをインストールする方法3選