概要
事象
MySQLが動くDockerコンテナを、docker-composeで立ち上げようとしたところ、コンテナが永遠に再起動(restart)を繰り返す事象が起こりました。この問題の解決方法を、ここにメモしておきます。
ちなみに、私はWindows上でDocker Toolboxを用いていた時にこの問題が起こりましたが、それ以外の環境だとこの問題は起こらなさそうです(おそらく)。
docker-compose.ymlの設定
docker-compose.ymlのうち、この問題が起こる部分の設定は以下のようになっています。
db:
image: mysql:5.7
volumes:
- "/tmp/db/data:/var/lib/mysql"
- "./db:/usr/src/db"
restart: always
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: $MYSQL_DATABASE
MYSQL_USER: $MYSQL_USER
MYSQL_PASSWORD: $MYSQL_PASSWORD
ports:
- 3306:3306
特別な設定は何もしておらず、単純にmysql:5.7
のイメージをベースに必要最低限の設定をしているのみです。
対処法
立ち上がったコンテナ内で、--innodb-use-native-aio=0
を実行させます。なので、docker-compose.ymlは以下のようになります。
db:
image: mysql:5.7
volumes:
- "/tmp/db/data:/var/lib/mysql"
- "./db:/usr/src/db"
restart: always
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: $MYSQL_DATABASE
MYSQL_USER: $MYSQL_USER
MYSQL_PASSWORD: $MYSQL_PASSWORD
ports:
- 3306:3306
command: --innodb-use-native-aio=0 # <- これ!
なぜこれで解決するのか
MySQLの公式ドキュメントには、以下のような記述があります。
InnoDB uses the asynchronous I/O subsystem (native AIO) on Linux to perform read-ahead and write requests for data file pages. This behavior is controlled by the innodb_use_native_aio configuration option, which applies to Linux systems only and is enabled by default.
InnoDB(MySQLのためのデータベースエンジン)はデフォルトでLinuxの非同期I/O(native AIO)を用いるように設定されていますが、この挙動はinnodb_use_native_aio
オプションで変更できます。
今回私はWindows上でDocker Toolboxを用いてコンテナを動かしていたのですが、その場合だとこの非同期I/Oが利用できないため、エラーが起こり再起動が繰り返されていたようです。そのため、公式ドキュメントの上に引用した部分に書いてある通り、innodb_use_native_aio
オプションで非同期I/Oを用いないように設定して、この問題を回避する必要があります。
コンテナの再起動について
コンテナが再起動するのは、私がdocker-compose.ymlにrestart:always
を書いているからです。それ以外の場合は、普通にコンテナが落ちると思われます。