LaradockでMySQLが立ち上がらない時は


## はじめに
今回dockerを用いてMySQLを立ち上げる際にハマったところをメモしておきます。
###環境
・**マシン** : Windows10 Home
・**Docker version** : 18.03.0-ce, build 0520e24302
・**docker-compose version** : 1.20.1, build 5d8c71b2
・**MySQL version** : 5.7
### 前提条件

- 既にdocker,docker-compose,mysqlのイメージなどの環境が構築済みであること。
 
## エラーとの格闘
###初期エラー
とりあえずシンプルな起動コマンドを叩く

```
> docker-compose up -d mysql
```
とりあえず立ち上がってくれない（いつもどおり、、）

```
      Name                   Command             State    Ports
---------------------------------------------------------------
laradock_mysql_1   docker-entrypoint.sh mysqld   Exit 3
```
次に細かくエラー内容を見に行く

```
> docker-compose up mysql
```
すると以下のエラー内容が表示される

```
Attaching to laradock_mysql_1
mysql_1                | 2019-07-24T20:22:43.160459Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
mysql_1                | 2019-07-24T20:22:43.160506Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
mysql_1                | 2019-07-24T20:22:43.160510Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
mysql_1                | 2019-07-24T20:22:43.164650Z 0 [Note] mysqld (mysqld 5.7.26) starting as process 1 ...
mysql_1                | 2019-07-24T20:22:43.169111Z 0 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql_1                | 2019-07-24T20:22:43.170378Z 0 [Note] InnoDB: PUNCH HOLE support available
mysql_1                | 2019-07-24T20:22:43.170491Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
mysql_1                | 2019-07-24T20:22:43.170705Z 0 [Note] InnoDB: Uses event mutexes
mysql_1                | 2019-07-24T20:22:43.170896Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
mysql_1                | 2019-07-24T20:22:43.171142Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
mysql_1                | 2019-07-24T20:22:43.171263Z 0 [Note] InnoDB: Using Linux native AIO
mysql_1                | 2019-07-24T20:22:43.172082Z 0 [Note] InnoDB: Number of pools: 1
mysql_1                | 2019-07-24T20:22:43.172468Z 0 [Note] InnoDB: Using CPU crc32 instructions
mysql_1                | 2019-07-24T20:22:43.174617Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
mysql_1                | 2019-07-24T20:22:43.188484Z 0 [Note] InnoDB: Completed initialization of buffer pool
mysql_1                | 2019-07-24T20:22:43.190874Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
mysql_1                | 2019-07-24T20:22:43.219977Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
mysql_1                | 2019-07-24T20:22:43.228388Z 0 [ERROR] InnoDB: Operating system error number 22 in a file operation.
mysql_1                | 2019-07-24T20:22:43.228697Z 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument'
mysql_1                | 2019-07-24T20:22:43.228943Z 0 [Note] InnoDB: Some operating system error numbers are described at http://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.html
mysql_1                | 2019-07-24T20:22:43.229187Z 0 [ERROR] InnoDB: File ./ib_logfile0: 'aio write' returned OS error 122. Cannot continue operation
mysql_1                | 2019-07-24T20:22:43.229370Z 0 [ERROR] InnoDB: Cannot continue operation.
laradock_mysql_1 exited with code 3
```
###わかったこと
- とりあえずよくわからないこと（大丈夫か？）
- ファイル読み込みと書き込みが行えないとシステムエラーが出ているっぽいこと
- DBエンジン(InnoDB)が「コマンドの引数が無効になってるよ」と指摘しているっぽいこと　←あやしい、、 

## 解決までの道のり
###とりあえずdocker-compose.ymlファイルを見に行く
MySQL箇所のみ抜粋

```
### MySQL ################################################
    mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - TZ=${WORKSPACE_TIMEZONE}
      volumes:
        - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend
```
エラー内容と照合してみると、volumesで指定しているファイルへの操作が正常に行えていないっぽい。。

色々調べた結果以下のコマンドを追加すると正常にファイル操作が行えそうだと判明した

```
--innodb-use-native-aio=0
```

このコマンドによってファイルシステムの互換性の問題が解消されるみたいです
### docker-compose.ymlファイルを修正

```
### MySQL ################################################
    mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - TZ=${WORKSPACE_TIMEZONE}
      volumes:
        - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend
      command: --innodb-use-native-aio=0 #追加
```

最終行に追加しました。
これで実際に動くか試してみます。

```
> docker-compose up -d mysql
```

```
      Name                    Command               State                 Ports
---------------------------------------------------------------------------------------------
laradock_mysql_1   docker-entrypoint.sh --inn ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
```

無事立ち上がりましたー！

##おわりに
今回MySQLコンテナだけ起動しないことにかなりハマってしまいました。
色々調べた際に皆さん結構同じような内容で躓いていたみたいなので自分なりに解釈しながら分かったことを投稿しておこうと思います。
間違い等ありましたら是非ご指摘お願いいたします。

###参考にしたサイト
<a href='https://translate.google.com/translate?hl=ja&sl=en&u=https://github.com/docker-library/mysql/issues/371&prev=search'>On OSX with volumes : InnoDB : Error 22 with aio_write #371</a>
<a href='https://blog.tes.co.jp/entry/2018/07/09/100555'>Docker 18.03でMySQL5.7コンテナ起動時に[File ./ib_logfile101: 'aio write' returned OS error 122.]メッセージが表示されたときの対処法</a>