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

  # LaravelでSQliteを導入するのにめちゃめちゃ苦労したお話
Laravelの参考書でSQliteを使わなければいけなかったのですがデフォルトの環境がmySQLになっていました。

[Docker版Laravelはこちらの環境を使わせていただきました](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)

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

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

まぁMySQLの設定はいらないよねってことでdocker-compose.ymlファイルのDB関連すべてコメントアウト。
```yml
    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データベースを使ってみよう](https://reffect.co.jp/laravel/laravel_sqlite)

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

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

余談ですが、環境を整えてマイグレーションは出来たので、どうもデータベース自体は動いているんです。
どうにかこうにかデータベースを確認する方法をググりまくり、[このページの通りにデータベースを確認してみた。](https://oki2a24.com/2020/03/03/check-laravel-6-db-connection-easily/)
うん。sqliteは動いてるようです。
```php
> 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入ってないんですよね？

ということで

[こちらのページを参考にして](https://askubuntu.com/questions/208393/unable-to-locate-package-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以下に進んでしまう前に入れてしまわないとダメなのかな？と判断し、一番最初の
```Dockerfile
RUN apt-get update
```
の下にもう一個RUNさせてみたらうまくいきました。ラッキーです😅
VSCode使ってますが37行目に挿入ですね。

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

```
ちなみにsqlite3から抜け出すときは
```
sqlite> .exit
```
ですよ。
普通にexitやらctrl+cやらで抜け出そうとしててんやわんやなりました💦
[sqlite3で終了、exitする方法](https://chico-shikaku.com/2019/11/sqlite3-exit-command/)