Lorsque j'ai essayé de lancer un conteneur Docker exécutant MySQL avec docker-compose, le conteneur a redémarré à plusieurs reprises pour toujours. Notez ici la solution à ce problème.
Au fait, j'ai eu ce problème lors de l'utilisation de Docker Toolbox sur Windows, mais cela semble peu probable (probablement) dans d'autres environnements.
Les paramètres de la partie de docker-compose.yml où ce problème se produit sont les suivants.
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
Aucun réglage spécial n'est fait, juste les réglages minimum nécessaires basés sur l'image de mysql: 5.7
.
Exécutez --innodb-use-native-aio = 0
dans le conteneur lancé. Donc, docker-compose.yml ressemble à ceci:
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 # <-cette!
Le Document MySQL officiel a la description suivante.
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 (moteur de base de données pour MySQL) est configuré pour utiliser les E / S asynchrones Linux (AIO natif) par défaut, mais ce comportement peut être changé avec l'option ʻinnodb_use_native_aio`.
Cette fois, j'exécutais le conteneur sous Windows à l'aide de Docker Toolbox, mais dans ce cas, cette E / S asynchrone n'est pas disponible, il semble donc qu'une erreur s'est produite et le redémarrage a été répété. Par conséquent, comme indiqué dans la partie citée ci-dessus de la documentation officielle, l'option ʻinnodb_use_native_aio` doit être définie pour ne pas utiliser les E / S asynchrones pour éviter ce problème.
Le conteneur redémarre car j'ai écrit restart: always
dans docker-compose.yml. Sinon, le conteneur tombera normalement.