docker-composeで起動してるMySQLがうまく終了しなくなってたのを直した

# 概要

私が頻繁に使っているローカル開発環境用の `docker-compose.yml` に含まれるMySQLが気づいたらちゃんと終了しなくなっていて、たまにデータをぶっ壊していたから直しました。

# 原因

mysqlコンテナを `command: bash-c 'ほげほげ' ` で起動していたら、PID1で起動するもんで、終了時のkillをうまくハンドリングできずに、mysqlのプロセスまでkillが届かず落ちなくて、タイムアウトでホストから落とされていた(データ壊す危険)。

# docker-compose.ymlにやったこと

initオプションを指定して `/dev/ihit` 越しに起動してあげればこいつがちゃんとハンドリングしてくれます。
3.5だったので、3.7へバージョン上げて、下記のように `init: true` を指定しました。

```yml
version: '3.7'
services:
  mysql:
    image: mysql:5.7
    init: true
    command: bash -c '
      touch /var/log/mysql/general.log &&
      chown mysql:mysql /var/log/mysql/general.log &&
      tail -f /var/log/mysql/general.log &
      /entrypoint.sh mysqld
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --general-log=true
      --general-log-file=/var/log/mysql/general.log
      --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
      --innodb-use-native-aio=0'
```



## before

指定していなかった時代

```sh
root@4b13f5625011:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:53 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
root         7     1  0 05:53 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
mysql        8     1  5 05:53 ?        00:00:00 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0
root        14     7  0 05:53 ?        00:00:00 tail -f /var/log/mysql/general.log
root        65     0  0 05:53 pts/0    00:00:00 bash
root        71    65  0 05:53 pts/0    00:00:00 ps -ef
```

### after

指定した時代

```sh
root@8771d0333475:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:00 ?        00:00:00 /sbin/docker-init -- docker-entrypoint.sh bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-
root         7     1  0 06:00 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
root         9     7  0 06:00 ?        00:00:00 bash -c  touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql
mysql       10     7  2 06:00 ?        00:00:00 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0
root        13     9  0 06:00 ?        00:00:00 tail -f /var/log/mysql/general.log
root        67     0  1 06:00 pts/0    00:00:00 bash
root        73    67  0 06:00 pts/0    00:00:00 ps -ef
```

# 結果

こうするとホストから `Ctrl + C`を叩き込んでもタイム・アウトすることなく、素直に落ちてくれるようになりました。


# 参考

- Dockerの--initフラグについて  https://christina04.hatenablog.com/entry/docker-init