とにかく進歩が早い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