🐳

Composer がインストールされていない環境で既存の Laravel プロジェクトに Laravel Sail をインストールする方法

2023/12/30に公開
3
変更履歴
  • 2024/1/3: 「Composer を利用せずに Sail をインストールするコマンド」の説明文を修正

こんにちは。 SAW です。
早いもので 2023 年も終わりですね。
2024 年もみなさんにとって良い年になればと思います。

Laravel のパッケージには、 Docker を利用した開発環境を簡単に構築できる Laravel Sail が用意されています。
新規プロジェクトを作成する場合は、公式ドキュメントに従ってインストールスクリプトを実行すると、 Laravel プロジェクトの作成と同時に Docker コンテナが作成されます。

一方、 Git で管理されている既存の Laravel プロジェクトを clone する場合、 vendor ディレクトリ以下のファイルは管理対象外 のため、 Sail は含まれません。
Sail を利用するためには Composer のパッケージをインストールする必要があります。
しかし、 Composer がインストールされていない環境では Sail がインストールできません。

本記事では、 Composer がインストールされていない環境で既存の Laravel プロジェクトに Laravel Sail をインストールする方法を紹介します。
なお、本記事では Laravel のバージョンが 10.x 系 を前提としています。

対象読者

本記事で想定する読者層は次の通りです。

  • Laravel について基本的な知識を有している
  • Docker について基本的な知識を有している

Laravel Sail とは

Laravel Sail は、 Laravel が公式で提供している Docker 開発環境です。
PHP や Composer などがインストールされていない環境でも、 Docker さえインストールされていれば、簡単に開発環境を構築できます。

Sail を利用して新規プロジェクトを作成
curl -s "https://laravel.build/example-app" | bash

https://laravel.com/docs/10.x/installation#docker-installation-using-sail

Laravel の Docker 開発環境として Laradock もありますが、 Sail は 起動するコンテナが少なく、軽量です。
また、 Sail は Docker コンテナを起動するだけでなく、 artisan や MySQL コンテナを操作する CLI も提供しています。

Sail を Composer を利用せずにインストールする方法

公式ドキュメントには、以下のコマンドを利用することで、既存の Laravel プロジェクトに Sail を含む依存パッケージをインストールできる と記載されています。
なお、コマンドを実行する際は、あらかじめプロジェクトのルートディレクトリに移動する必要があります。

Composer を利用せずに Sail をインストールするコマンド
docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v "$(pwd):/var/www/html" \
    -w /var/www/html \
    laravelsail/php82-composer:latest \
    composer install --ignore-platform-reqs

上記のコマンドは、 Composer の Docker イメージ を利用して Sail を含む Composer の依存パッケージをインストール します。
上記のコマンドの場合、 laravelsail/php82-composer イメージから Composer のコンテナを作成し、そのコンテナ内で composer install --ignore-platform-reqs を実行しています。

これで Comopser がインストールされていない環境でも既存の Laravel プロジェクトに Sail がインストールできます。

docker run コマンドのオプション

コンテナ経由で Sail を インストールする docker run コマンドには、いくつかオプションが指定されています。
それぞれのオプションの意味を以下の表に記載します。

オプション 意味
--rm コンテナ終了時にコンテナを削除する
-u コマンドを実行する際のユーザーを指定する
-v ホスト側のボリュームをコンテナにマウントする
-w コンテナの作業ディレクトリを指定する

https://minegishirei.hatenablog.com/entry/2023/05/09/095603

docker run-u オプションに id の実行結果を指定することで、ホスト側のログインユーザーの UID, GID を指定してコマンドを実行できます。
ログインユーザーの UID は id -u, GID は id -g でそれぞれ取得できます。

docker run-u オプションを指定しない場合、環境によっては root ユーザーとしてコマンドが実行される場合があります。
コンテナのコマンドによってホストからマウントされたボリュームにファイルが追加される場合、 root ユーザーでコマンドを実行するとファイルの所有者がホスト側でも root になることがあります。

今回の場合、 vendor 以下にインストールされるファイルやディレクトリの所有者が root になりうるため、 docker run-u オプションを指定することをオススメします。

まとめ

本記事のまとめは次の通りです。

  • Composer がインストールされていない環境で Sail をインストールする方法を紹介
    • Composer の Docker イメージを利用して依存パッケージをインストール

既存の Laravel プロジェクトへの Sail のインストールも、新規プロジェクト生成と同じくらい簡単に実行できるようになったら嬉しいなと思いました。

参考文献

https://stackoverflow.com/questions/71025461/laravel-sail-after-cloning-from-git-repository
https://laravel.com/docs/9.x/sail#installing-composer-dependencies-for-existing-projects

Discussion

あかつかあかつか

「 Composer の Docker イメージ」の部分は「コンテナ内のcomposer」が適切かと思います。
docker runで引数にコマンドを渡した時はコンテナ内のコマンドが実行されるはずで、sailのDockerfileにはcomposerをインストールするスクリプトが書かれているのでコンテナ内にcomposerはインストールされていると思われます。
認識違いなどでしたらすみません🙇‍♂️

SAWSAW

コメントありがとうございます。
私自身、 イメージとコンテナが正しく区別できていなかったので、 docker run についてドキュメントを確認してみたところ、 Docker イメージと実行するコマンドを引数に受け取ると記載されていました。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

https://docs.docker.com/engine/reference/commandline/run/

上記のコマンドは、 Composer の Docker イメージ を利用して Sail を含む Composer の依存パッケージをインストール します。

docker run の引数に渡すのは Docker イメージで良いのですが、コマンドはコンテナ内で実行されるので、この文章だと混乱を招きますね...
混乱がないように文章を修正しておきます。
ありがとうございます🙇‍♂️🙇‍♂️

あかつかあかつか

イメージがこれ
laravelsail/php82-composer:latest
で、コマンドが
composer install --ignore-platform-reqs
これかなと思います