とにかくまずはLaravelのローカル開発環境を立ち上げる
Laravel 8 をインストールしていきます
Getting Started On macOS によると、Docker Desktop がインストールされていればこれだけでサンプルアプリが立ち上がるようです
curl -s "https://laravel.build/example-app" | bash
URL の中身はこのようなスクリプトでした
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/php81-composer:latest \
bash -c "laravel new example-app && cd example-app && php ./artisan sail:install --with=mysql,redis,meilisearch,mailhog,selenium "
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
スクリプト内で laravelsail/php81-composer:latest
という Docker イメージを利用していて、これが Laravel Sail という便利ツールのイメージでした。
Dockerfile はおそらくこちら
linux/arm64
向けにもビルドされているようで、Apple M1チップの macOS でも動きそうです
実行
$ curl -s "https://laravel.build/example-app" | bash
Unable to find image 'laravelsail/php81-composer:latest' locally
(略)
Digest: sha256:b27920b769ad8dc036a9ede3ae36f51a280d370ec7d125e77ca1924c9fa21dbb
Status: Downloaded newer image for laravelsail/php81-composer:latest
_ _
| | | |
| | __ _ _ __ __ ___ _____| |
| | / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V / __/ |
|______\__,_|_| \__,_| \_/ \___|_|
Warning: TTY mode requires /dev/tty to be read/writable.
Creating a "laravel/laravel" project at "./example-app"
Installing laravel/laravel (v8.6.10)
(略)
Application ready! Build something amazing.
Sail scaffolding installed successfully.
Please provide your password so we can make some final adjustments to your application's permissions.
Password:
Thank you! We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up
うまくいきました。最後の Password 入力は、Docker コンテナ内で保存したファイルが root 所有になっているので、それを chown するためです
./vendor/bin/sail up
を実行する前に docker-compose.yml を見てみます
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
(略)
mysql:
image: 'mysql/mysql-server:8.0'
(略)
redis:
image: 'redis:alpine'
(略)
meilisearch:
image: 'getmeili/meilisearch:latest'
(略)
mailhog:
image: 'mailhog/mailhog:latest'
(略)
selenium:
image: 'selenium/standalone-chrome'
(略)
laravel.test, mysql, redis, mailisearch, mailhog, selenium の6つの service が定義されていました。実行したスクリプトの中に
php ./artisan sail:install --with=mysql,redis,meilisearch,mailhog,selenium
というコマンドがあり、ここで指定したミドルウェアが反映されているようです。
sail up
してみます
$ cd example-app
$ vendor/bin/sail up
(略)
Pulling mysql (mysql/mysql-server:8.0)...
(略)
Pulling redis (redis:alpine)...
(略)
Pulling meilisearch (getmeili/meilisearch:latest)...
(略)
Pulling mailhog (mailhog/mailhog:latest)...
(略)
Pulling selenium (selenium/standalone-chrome:)...
(略)
Building laravel.test
[+] Building 438.9s (17/17) FINISHED
けっこうビルドが長くて8分くらいかかりましたが、これで立ち上がりました。
http://localhost/ にアクセスして上手くいったことを確認できました
sail コマンドは、おおむね docker-compose のエイリアスになっているようです。引数なしで起動すると、docker-compose ps と同じ出力でした
$ ./vendor/bin/sail
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------
example-app_laravel.test_1 start-container Up 0.0.0.0:80->80/tcp, 8000/tcp
example-app_mailhog_1 MailHog Up 0.0.0.0:1025->1025/tcp,
0.0.0.0:8025->8025/tcp
example-app_meilisearch_1 tini -- /bin/sh -c ./meili ... Exit 1
example-app_mysql_1 /entrypoint.sh mysqld Up (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp,
33061/tcp
example-app_redis_1 docker-entrypoint.sh redis ... Up (healthy) 0.0.0.0:6379->6379/tcp
example-app_selenium_1 /opt/bin/entry_point.sh Up 4444/tcp, 5900/tcp
meilisearch だけ落ちているので確認してみます
$ ./vendor/bin/sail logs meilisearch
Attaching to example-app_meilisearch_1
meilisearch_1 | Error: Function not implemented (os error 38)
docker-compose.yml に記述があるので linux/x86_64 のエミュレーションで動くはずですが、今回は上手く動いていないような気がします
meilisearch:
image: 'getmeili/meilisearch:latest'
platform: linux/x86_64
この件の issue がありました
issue をたどっていくと、すでに arm64 向けの Docker イメージを用意する Pull Request は取り込まれていることがわかりました
v0.25.0 以降、arm64 に対応しています
とすると、docker-compose.yml から platform: linux/x86_64
の1行を消して sail up -d をし直すだけで動くと思ったのですが、エラーになってしまいました
meilisearch_1 | Error: Version file is missing or the previous MeiliSearch engine version was below 0.24.0. Use a dump to update MeiliSearch.
example-app_meilisearch_1 exited with code 1
おそらく、
volumes:
- 'sailmeilisearch:/data.ms'
の volume に保存されたデータがよくない予感がします。今回は手っ取り早く
vendor/bin/sail down -v
vendor/bin/sail up -d
とすることで volume も潰してゼロからやり直し、無事に回復させました。
$ ./vendor/bin/sail ps meilisearch
Name Command State Ports
--------------------------------------------------------------------------------------------------
example-app_meilisearch_1 tini -- /bin/sh -c ./meili ... Up (healthy) 0.0.0.0:7700->7700/tcp
platform: linux/x86_64
の記述を削除する PR を出してみました