とにかく進歩が早い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だけ. カンマ区切りで複数指定可.
1 2 3 |
$ 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を変更する. (パスワードが要求される)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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 を実行する.
1 2 |
$ cd example-app $ ./vendor/bin/sail up |
dockerそのものなので, Ctrl+Cで落ちる.
もちろん、./vendor/bin/sail up -d によりバックグラウンドで立ち上がる.
1 |
$ ./vendor/bin/sail up -d |
ブラウザからhttp://localhostを開く
ちなみに Dockerfile内で /usr/local/bin/start-containerを実行している.
start-container内ではsupervisordによりLaravelのビルトインサーバをデーモン化している.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/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は以下の通り.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[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コマンドを打っているような感覚. 良いと思う.
1 2 |
$ ./vendor/bin/sail artisan --version Laravel Framework 8.41.0 |