Laravel8 sailで環境構築

とにかく進歩が早いLaravel。
セマンティックバージョニングになった6あたりから結構な速度で機能を乗せて来た感がある.
付いていくのがなかなか大変というのはある.
開けた口に無理やり食べ物を押し込んでくるような強引さの中にセンスの良さを感じ取れるので、
ちょっと付いて行ってみることにする.

Laravel sail

Laravel公式が用意するDocker開発環境を操作する軽量なコマンドラインインターフェース.
ポイントは、コンテナの外部からコンテナ内のLaravelに対してコマンドを実行できる点.
dockerコマンドをラップし、コンテナの内部で実行した結果を応答する仕組みとなっている.
フルスタックフレームワークであるLaravelらしく何でも内包してしまう.

composerやartisanコマンド実行のために、わざわざdockerコマンドを叩くのは辛い.
sailが無いとdockerコマンドを叩きまくるか、コンテナに入って作業する必要がある.
sailを使うことで、コンテナの中に入らず外からかsailコマンドを実行できる.

こんな風にするとdockerの上位に来る仕組みを作れるのか、と結構感動.

sailでプロジェクトを作る

既存のプロジェクトにsailを導入するパターンと、新規にプロジェクトを作成するパターンの2通りがある.
今回は新規にプロジェクトを作成していく.

https://laravel.build/example-app というURLはShellScriptのコードを返す.
withの後ろにインストールしたいミドエウウェアを指定する.
今回はmysqlだけ. カンマ区切りで複数指定可.


$ mkdir -p ~/hoge && cd ~/hoge
$ curl -s "https://laravel.build/example-app?with=mysql" | bash
$ cd example-app && ./vendor/bin/sail up

ちなみに、https://laravel.build/example-appは以下のShellScriptを返す.
そのShellScriptは何をやっているかというと.

  • laravelsail/php80-composerというイメージからコンテナを起動する.
  • laravel newコマンドでプロジェクトを作成する.
  • artisan sail:installコマンドを実行する.
  • ディレクトリのOwnerを変更する. (パスワードが要求される)

docker info > /dev/null 2>&1

# Ensure that Docker is running...
if [ $? -ne 0 ]; then
    echo "Docker is not running."

    exit 1
fi

docker run --rm \
    -v $(pwd):/opt \
    -w /opt \
    laravelsail/php80-composer:latest \
    bash -c "laravel new example-app && cd example-app && php ./artisan sail:install --with=mysql"

cd example-app

CYAN='\033[0;36m'
LIGHT_CYAN='\033[1;36m'
WHITE='\033[1;37m'
NC='\033[0m'

echo ""

if sudo -n true 2>/dev/null; then
    sudo chown -R $USER: .
    echo -e "${WHITE}Get started with:${NC} cd example-app && ./vendor/bin/sail up"
else
    echo -e "${WHITE}Please provide your password so we can make some final adjustments to your application's permissions.${NC}"
    echo ""
    sudo chown -R $USER: .
    echo ""
    echo -e "${WHITE}Thank you! We hope you build something incredible. Dive in with:${NC} cd example-app && ./vendor/bin/sail up"
fi

sailでコンテナを立ち上げる

要はdocker-compose upをラップしたsail upコマンドを叩く.
PHPのbundlerであるcomposerの仕様上, vendor 以下にモジュールがインストールされる.
sailコマンドも ./vendor/bin/ に入っている. そこで ./vendor/bin/sail up を実行する.


$ cd example-app
$ ./vendor/bin/sail up

dockerそのものなので, Ctrl+Cで落ちる.
もちろん、./vendor/bin/sail up -d によりバックグラウンドで立ち上がる.


$ ./vendor/bin/sail up -d

ブラウザからhttp://localhostを開く

あっさり開けた.

ちなみに Dockerfile内で /usr/local/bin/start-containerを実行している.
start-container内ではsupervisordによりLaravelのビルトインサーバをデーモン化している.


#!/usr/bin/env bash

if [ ! -z "$WWWUSER" ]; then
    usermod -u $WWWUSER sail
fi

if [ ! -d /.composer ]; then
    mkdir /.composer
fi

chmod -R ugo+rw /.composer

if [ $# -gt 0 ];then
    exec gosu $WWWUSER "$@"
else
    /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi

supervisord.confは以下の通り.


[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid

[program:php]
command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
user=sail
environment=LARAVEL_SAIL="1"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

sailでLaravelのバージョンを確認してみる

試しにコンテナの外からsailコマンドでartisan –versionを実行してみる.
まるでコンテナの外からartisanコマンドを打っているような感覚. 良いと思う.


$ ./vendor/bin/sail artisan --version
Laravel Framework 8.41.0