【Laravel】Sail開発環境、file_put_contents(…): Failed to open stream: Permission denied


Laravel + Docker(Sail)構築手順 – Windows版

Laravelインストール手順

VSCode起動してターミナルを起動してUbuntsを選択します

【VSCodeの場合】
Ubuntu(WSL)に切り替える
ターミナル右上の + 横の 下矢印ボタン ⏷ をクリック

実際にダウンロードされるスクリプトの中身からDockerコマンドが実行されるため、Ubunts内で行う必要がありますね!

PowerShell Git Bash Command Prompt Ubuntu (WSL) JavaScript デバッグ ターミナル ターミナルの分割 既定のプロファイルの選択 ターミナル設定の構成

WSL2 上で一般ユーザーでログインしないと権限のエラーが発生してしまう(プロジェクトのファイルやディレクトリがrootユーザーによって作成されるため、Laravel Sailがアクセスできないため)

原因はプロジェクトを root ユーザーで作成した環境。

推奨対策は一般ユーザーを作成し、それを Docker グループに追加 → そのユーザーで Laravel プロジェクト作成

https://biz.addisteria.com/laravel-sail_ubuntu_permission

# 1. 一般ユーザーの作成(rootユーザーで実行)
sudo adduser yourname

# パスワード設定やユーザー情報は適宜入力(すべてEnterでスキップ可能)

# 2. Docker操作権限を与える
sudo usermod -aG docker yourname

# 3. グループに追加されているか確認
sudo groups yourname
# → 出力例: yourname : yourname users docker

# 4. 作成したユーザーに切り替える
su - yourname

上記で今いる場所は一般ユーザー(yourname)でのそのホームディレクトリになります

こちらWSL2のLinuxネイティブファイルシステム内で権限問題も発生しないので⭕

yourname@LAPTOP-2C4PL9J8:~$ pwd
/home/yourname
yourname@LAPTOP-2C4PL9J8:~$ ls -a
.  ..  .bash_logout  .bashrc  .landscape  .motd_shown  .profile
yourname@LAPTOP-2C4PL9J8:~$
Windows PC
├── C:\Users\username\                ← Windows側ユーザーディレクトリ(NTFS)
│     └── …                          ← WSL2 からは /mnt/c/Users/username/ でアクセス
│                                    × Laravelプロジェクトを置くと:
│                                      - パーミッションが効かない
│                                      - ファイルアクセスが遅い
│                                      - DockerとLaravel Sailでエラー多発
│
└── WSL2 Linux 仮想マシン(ext4)
    ├── /                             ← Linuxファイルシステムのルート
    ├── /home/
    │   └── yourname/                 ← 一般ユーザーのホームディレクトリ
    │       ├── .bashrc
    │       ├── .profile
    │       └── dev/                 ← ★ Laravelプロジェクトはここに作成すべき
    │           └── laravel/         ← `curl -s https://laravel.build/laravel | bash`
    │
    ├── /root/                        ← rootユーザー専用ホーム(使わないこと)
    │
    └── /mnt/                         ← Windowsドライブのマウントポイント
        └── /c/
            └── /Users/
                └── username/        ← WindowsのC:\Users\username に対応

Laravel 作成前の注意

Laravelプロジェクト作成 (curl https://laravel.build/... | bash) を実行する前に、
ログイン中のユーザーが本当に一般ユーザー(widaなど)であることを必ず確認してください。

ターミナルの見た目で username@LAPTOP-... と表示されていても、
su - username 等で切り替えた場合は 中身が root のままになっているケースがあります。

これに気づかず Laravel を作成すると、全ファイルが root 所有になり、後々の composer, artisan, npm すべてが破綻します。

whoami   # → wida であること
id       # → uid=1001(wida) など、uid=0(root) でないことを確認

Laravelファイル群を生成するだけでなく、Docker化された完全な開発環境を一括でセットアップされます

username@LAPTOP-2C4PL9J8:~$ mkdir -p ~/dev
username@LAPTOP-2C4PL9J8:~$ cd dev/
username@LAPTOP-2C4PL9J8:~/dev$ curl -s https://laravel.build/laravel | bash

# タイムアウトで失敗したら10分に延長して再度実行(結構時間かかりますね、、)
export COMPOSER_PROCESS_TIMEOUT=600

Laravel Sailを起動

cd laravel
./vendor/bin/sail up -d

file_put_contents(…): Failed to open stream: Permission denied

Laravel Sailを起動してlocalhostにアクセスするとfile_put_contents(…): Failed to open stream: Permission deniedというエラー、、

原因はLaravel内部の storage/ や bootstrap/cache/ に書き込み権限がないため、、

rootでなく一般ユーザーでLaravelプロジェクトを作成したのですが、それでもLaravel Sailから書き込みができるようパーミッション修正が必要なのです

(解決手順)

対処にはroot権限が必要になるのですが、現在は一般ユーザーの状態でrootに切り替える必要があります

root に切り替えて一般ユーザーに sudo 権限を付与

usermod -aG sudo username

今度は一般ユーザーにまた戻して

cd ~/dev/laravel
sudo chmod -R 775 storage bootstrap/cache
sudo chown -R $(whoami):www-data storage bootstrap/cache

rootのパスワード忘れた場合

# PowerShellから root で強制ログインしてパスワード再設定
wsl -u root
passwd

データベースマイグレーションを実行

./vendor/bin/sail artisan migrate

http://localhostでウェルカムページが表示されます!

Laravel Let’s get started Laravel has an incredibly rich ecosystem. We suggest starting with the following. Read the Documentation → Watch video tutorials at Laracasts → Deploy now http://localhost

WSLでVSCodeを安定して使う方法

# WSLのデフォルトユーザーを wida に変更
sudo nano /etc/wsl.conf

# 追記
[user]
default=wida
# PowerShellで

wsl --shutdown

VSCode Remote – WSL を初回だけ Windows から手動で起動

  • Windowsで VSCode を起動
  • Ctrl + Shift + P → Remote-WSL: Connect to WSL using Distro
  • Ubuntu を選択
  • 初回接続時に VSCode Serverがインストールされる
  • フォルダ選択で \wsl$\Ubuntu\home\wida\dev\laravel を開く

Laravel Sail の正体は、Laravel開発用にチューニングされたDockerラッパースクリプト

処理内容自動化されてる?実際の挙動
Dockerイメージの取得laravelsail/php82-composer とか mysql:8 をPull
docker-compose.yml生成sail:install 実行時に .dockerdocker-compose.yml を作成
コンテナ起動sail up -d で Laravel(PHP)と MySQL の2コンテナが起動
ネットワーク/ボリューム作成LaravelとDBが同一ネットワークで通信できるように設定

先ほどのコンテナ起動でMySQLも一緒に起動されてます

./vendor/bin/sail up Laravel (PHP) + MySQL (DB) + その他 (Redis等) 1つのコマンドで複数のコンテナが同時起動

xserverのような共用サーバーではvendor/bin/sail artisan~のようなsailコマンドが使用できない??

Laravel Breezeのインストール手順

とりあえずLaravel Breezeをインストールしましょう!Laravel Breezeは認証機能(ログイン、登録、パスワードリセットなど)を簡単に追加できるスターターキットです。

Breezeパッケージをインストール

./vendor/bin/sail composer require laravel/breeze --dev
./vendor/bin/sail artisan breeze:install
./vendor/bin/sail npm install
./vendor/bin/sail npm run dev
./vendor/bin/sail artisan migrate