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する方法