Open5

とにかくまずはLaravelのローカル開発環境を立ち上げる

もりむらもりむら

Laravel 8 をインストールしていきます
https://laravel.com/docs/8.x/installation

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 という便利ツールのイメージでした。

https://github.com/laravel/sail

Dockerfile はおそらくこちら
https://github.com/laravel/sail/blob/v1.12.12/runtimes/8.1/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 がありました

https://github.com/meilisearch/MeiliSearch/issues/1195

issue をたどっていくと、すでに arm64 向けの Docker イメージを用意する Pull Request は取り込まれていることがわかりました

https://github.com/meilisearch/MeiliSearch/pull/1897

v0.25.0 以降、arm64 に対応しています

https://hub.docker.com/r/getmeili/meilisearch/tags

とすると、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