【Docker】mysqld: Table 'mysql.plugin' doesn't existエラーが表示された時

## 概要
railsアプリでデータベースにMysqlを使っていて、docker-composeによるオーケストレーションで使用しています。
しかし、ある日docker-compose upでimageを立ち上げたところ、表題のエラーが・・・。

なんとか修正したので備忘録として残しておこうかと思います。

## 現象
docker-compose upを実行すると、下記の様なエラーが表示される。
ちなみに先日までは普通に起動して動作していました。

```bash:terminal
MacBookPro:hogehoge username$ docker-compose up
Starting db_1 ... done
Starting web_1 ... done
Attaching db_1, web_1
db_1   | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
db_1   | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1   | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
db_1   | 2019-11-08 05:59:09 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1   | 2019-11-08 05:59:09 0 [Note] mysqld (mysqld 5.6.46) starting as process 1 ...
db_1   | 2019-11-08 05:59:09 1 [Note] Plugin 'FEDERATED' is disabled.
db_1   | mysqld: Table 'mysql.plugin' doesn't exist
db_1   | 2019-11-08 05:59:09 1 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
db_1   | 2019-11-08 05:59:09 1 [Note] InnoDB: Using atomics to ref count buffer pool pages
(省略)
```

## 環境
rails (5.2.3)
docker (19.03.4)
docker-compose (1.24.1)
mysql (5.6)

Dockerfileでrubyの構築、docker-composeでmysqlとrailsの操作をしています。

```Dockerfile:Dockerfile
# ruby2.5.1のalpineを指定
FROM ruby:2.5.1-alpine

# apk --update --no-cache add でインストールするパッケージを指定します
RUN apk --update --no-cache add tzdata libxml2-dev curl-dev make gcc libc-dev g++ mariadb-dev linux-headers nodejs && \
    mkdir /workdir

WORKDIR /workdir

ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock

ENV BUNDLER_VERSION 2.0.2
# && \で改行していくことにより、より軽量になるそうです
RUN gem install bundler && \
    bundle install && \
# Warningがでたのでここでupdateを一度入れています。
    apk update && \
# 上で指定したパッケージの中、開発環境を構築したら不要になるファイルたちです。apk delで消しちゃいます。
    apk del libxml2-dev curl-dev make gcc libc-dev g++ linux-headers

ADD . /workdir
# 構築したDockerの中に入って、大きく容量をとっているディレクトリを調べました。容量が大きく不要であるcacheファイルは構築後削除しています。
RUN rm -rf /usr/local/bundle/cache/* /workdir/vendor/bundle/cache/*
```

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.6
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASSWORD: password
    volumes:
      - ./mysql/mysql_data:/var/lib/mysql # データの永続化
    ports:
      - "4306:3306" # ホストからゲストへポートフォワード。sequelProと繋ぎたいので、3306ではなく4306をポートに指定
  web:
    build:
      context: .
      dockerfile: Dockerfile
    # 一度サーバーが起動すると起動し続けるので、rm -f /workdir/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
    command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/workdir # ソースコード変更したらDocker側も即反映されるように
```

## 結論
まず、ターミナルで下記を実行

``` bash:terminal
rm -rf /var/lib/mysql
```

その後、アプリケーションのルートディレクトリにある、mysqlというディレクトリを削除しました。
![image](https://i.gyazo.com/9933fd4d0582c632e836622bd40e9091.png)

その後、ターミナルで下記を実行

```bash:terminal
docker-clean all

docker-compose build

docker-compose up
```

再度、db:create、migrateなどを行えば、問題なく表示されることとなりました。

## 原因？
dockerでmysqlを起動すると、ルートディレクトリにmysqlというディレクトリが作成されます。
この中にどうやら今までのデータベースの変更内容などが保存されている様です。

で、別のブランチを切って開発を進めていた時にgitignoreしてしまったんですよね。
たぶんそれでmysqlの履歴と整合性が取れなくなってしまったんだと思っています。

あ、gitignoreファイルではmysqlディレクトリを指定するのをやめてます。