2
0

More than 1 year has passed since last update.

Docker版LaravelでmySQLからSQliteにデータベース変更してみた

Last updated at Posted at 2023-02-15

LaravelでSQliteを導入するのにめちゃめちゃ苦労したお話

Laravelの参考書でSQliteを使わなければいけなかったのですがデフォルトの環境がmySQLになっていました。

Docker版Laravelはこちらの環境を使わせていただきました

Laravelの環境はサクッとできたのですが、データベースがmySQL!
これをSQliteにということで3日ほど苦戦してしまいました。

環境設定でググりまくりました

とにかくDockerでやりたかったのでdocker-compose.ymlファイルやDockerfileをググって探しまくりましたが、どこにも見つかりません。

まぁMySQLの設定はいらないよねってことでdocker-compose.ymlファイルのDB関連すべてコメントアウト。

    environment:
      - APP_DEBUG=${APP_DEBUG:-true}
      - APP_ENV=${APP_ENV:-local}
      - APP_URL=${APP_URL:-http://localhost}
      - LOG_CHANNEL=${LOG_CHANNEL:-stderr}
      - LOG_STDERR_FORMATTER=${LOG_STDERR_FORMATTER:-Monolog\Formatter\JsonFormatter}
#      - DB_CONNECTION=${DB_CONNECTION:-sqlite}
#      - DB_HOST=${DB_HOST:-db}
#      - DB_PORT=${DB_PORT:-3306}
#      - DB_DATABASE=${DB_DATABASE:-laravel}
#      - DB_USERNAME=${DB_USERNAME:-phper}
#      - DB_PASSWORD=${DB_PASSWORD:-secret}

  web:
    build:
      context: .
      dockerfile: ./infra/docker/nginx/Dockerfile
    ports:
      - target: 80
        published: ${WEB_PUBLISHED_PORT:-80}
        protocol: tcp
        mode: host
    volumes:
      - type: bind
        source: ./src
        target: /workspace
#  db:
#    build:
#      context: .
#      dockerfile: ./infra/docker/sqlite/Dockerfile
#    ports:
#      - target: 3306
#        published: ${DB_PUBLISHED_PORT:-3306}
#        protocol: tcp
#        mode: host
#    volumes:
#      - type: volume
#        source: db-store
#        target: /var/lib/mysql
#        volume:
#          nocopy: true
#    environment:
#      - MYSQL_DATABASE=${DB_DATABASE:-laravel}
#      - MYSQL_USER=${DB_USERNAME:-phper}
#      - MYSQL_PASSWORD=${DB_PASSWORD:-secret}
#      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD:-secret}
  mailhog:
    image: mailhog/mailhog

そして、まずは環境だけでも作ってみようと一番参考になったサイトがこちらでした。
Laravelでsqliteデータベースを使ってみよう

ただし

Mac OS環境で動作確認を行っておりデフォルトでSQLiteがインストールされているためすぐに使用することができます。

とのことで、残念ながら私のWindows環境にはデフォルトではインストールされてなかったのでめちゃめちゃ苦労したんです💦

余談ですが、環境を整えてマイグレーションは出来たので、どうもデータベース自体は動いているんです。
どうにかこうにかデータベースを確認する方法をググりまくり、このページの通りにデータベースを確認してみた。
うん。sqliteは動いてるようです。

> DB::connection()->getConfig();
= [
    "driver" => "sqlite",
    "database" => "/workspace/database/database.sqlite",
    "prefix" => "",
    "foreign_key_constraints" => true,
    "name" => "sqlite",
  ]

SQlite3はインストールしたものの

とにもかくにもdocker compose exec app bashでコンテナに接続してsqlite3 database/database.sqliteを実行するも

OCI runtime exec failed: exec failed: unable to start container process: exec: "sqlite3": executable file not found in $PATH: unknown

というエラーに遭遇

要はsqlite3入ってないんですよね?

ということで

こちらのページを参考にして
コンテナにsqlite3をインストールしてみました。

以下の手順でコンテナにコマンド送信

apt-get update
apt-get upgrade
apt-get install libsqlite3-dev
apt-get install sqlite3
sqlite3 database/database.sqlite

で、動きました!!

SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.

なのですが、当然永続化されてないのでコンテナ閉じると、sqlite3消えます😢

Dockerfileで永続化してみました!!

Dockerfileの書き方がいまいちわかっていないのですが、とりあえずこれらのコマンドをphpのDockerfileに書き込めば大丈夫だろう!と。

直感でいじり倒します。
infra\docker\php\Dockerfile
に書き込みます。

最初は一番下に書き込みましたがうまくsqlite3立ち上がらず。直感で処理がinfra\php以下に進んでしまう前に入れてしまわないとダメなのかな?と判断し、一番最初の

RUN apt-get update

の下にもう一個RUNさせてみたらうまくいきました。ラッキーです😅
VSCode使ってますが37行目に挿入ですね。

RUN apt-get update \
  && apt-get upgrade\
  && apt-get install libsqlite3-dev\
  && apt-get install sqlite3

ちなみにsqlite3から抜け出すときは

sqlite> .exit

ですよ。
普通にexitやらctrl+cやらで抜け出そうとしててんやわんやなりました💦
sqlite3で終了、exitする方法

2
0
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
0