💭

Laravel Sail × MariaDBコンテナが起動しない原因と解決法

に公開

はじめに

Laravel Sailで開発環境を構築していると、MariaDB(MySQL)コンテナが起動時にエラーで止まることがあります。
この記事では、よくある原因とその解決方法をまとめます。

症状

  • docker-compose.yml でMariaDB(MySQL)サービスを定義
  • ./vendor/bin/sail up -d でコンテナ起動
  • MySQLコンテナが exited (1) で停止
  • ログを見ると Operation CREATE USER failed for 'root'@'%' やUnsupported storage engine: InnoDB などのエラー

原因

1.MySQLとMariaDBのデータ形式の違い

  • 以前MySQL 8.0で作成されたデータボリューム(ibdata1など)がMariaDB 10.6でサポートされていない
  • MariaDBが起動時にInnoDB初期化で失敗

2.ユーザー重複エラー

  • MariaDBの初期化スクリプトで root ユーザーが既に存在し、CREATE USERで重複エラー

3.環境変数の不整合

  • MYSQL_ROOT_PASSWORD などの値が不適切、または初期化処理が複数回走っている

解決方法

1. データボリュームの完全削除

開発用でデータ消失OKなら、古いMySQL用ボリュームを削除して新規作成します。

docker rm api-mysql-1
docker volume rm sail-mysql
./vendor/bin/sail up -d

docker rm api-mysql-1docker volume rm sail-mysql./vendor/bin/sail up -d

2. docker-compose.ymlの修正

環境変数を明示的に設定し、初期化エラーを回避します。

mysql:
  image: 'mariadb:10.6'
  ports:
    - '3306:3306'
  environment:
    MYSQL_ROOT_PASSWORD: 'secret'
    MYSQL_ROOT_HOST: "%"
    MYSQL_DATABASE: 'XXXX'
    MYSQL_USER: 'user'
    MYSQL_PASSWORD: 'secret'
  volumes:
    - 'sail-mysql:/var/lib/mysql'
  networks:
    - sail
  healthcheck:
    test: ["CMD", "mysql", "-psecret", "-e", "SELECT 1;"]
    retries: 3
    timeout: 5s

3. .envファイルのDB設定も揃える

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=XXXX
DB_USERNAME=user
DB_PASSWORD=secret

まとめ
Laravel SailでMariaDBコンテナが起動しない場合は、
「MySQLとMariaDBのデータ形式の違い」「ユーザー重複」「環境変数の不整合」が主な原因です。
ボリューム削除&環境変数の見直しでほぼ解決できます。

Discussion