2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel Sailをdevcontainerで動かすときは下準備が必要

Posted at

サンプルはこちら。


Laravel Sail とは、Laravel の開発環境をコンテナーでセットアップするためのツールです。

コンテナーで動作するということは、devcontainer で動かしたくなるものです。
Laravel Sail には devcontainer.json や docker-compose.yml を準備するコマンドも用意されています。

.devcontainer/devcontainer.json

// https://aka.ms/devcontainer.json
{
	"name": "Existing Docker Compose (Extend)",
	"dockerComposeFile": [
		"../docker-compose.yml"
	],
	"service": "laravel.test",
	"workspaceFolder": "/var/www/html",
	"settings": {},
	"extensions": [
		// "mikestead.dotenv",
		// "amiralizadeh9480.laravel-extra-intellisense",
		// "ryannaddy.laravel-artisan",
		// "onecentlin.laravel5-snippets",
		// "onecentlin.laravel-blade"
	],
	"remoteUser": "sail",
	"postCreateCommand": "chown -R 1000:1000 /var/www/html"
	// "forwardPorts": [],
	// "runServices": [],
	// "shutdownAction": "none",
}

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
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local

vendor の復元

上記の構成で足りてはいますが、リポジトリをクローンした直後など composer install を行っていない状態では、 devcontainer を起動することができませんでした。
An error occurred setting up the container. というエラーが起きました。

理由としては docker-compose.yml にて Laravel Sail のランタイムが指定されていますが、そのランタイムが無い(コミット対象外)であるためです。以下の context 部分です。

services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.1
            dockerfile: Dockerfile

そのため devcontainer を起動する前に、下記コマンドで composer install を実行しておきます。

docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v $(pwd):/var/www/html \
    -w /var/www/html \
    laravelsail/php81-composer:latest \
    composer install --ignore-platform-reqs

詳しくは Laravel Sail のドキュメントに記載されています。

.env の準備

Laravel Sail の起動の際に .env も必要ですが、これもコミット対象外であるため準備する必要があります。
.env.example から手動で作成してもよいですが、 devcontainer の起動時に準備しておきましょう。
devcontainer.json にコマンドを追加します。

"initializeCommand": "cp .env.example .env",

これで Laravel Sail を devcontainer で動かせるようになりました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?