J'ai des problèmes de connexion au conteneur docker mysql que j'ai lancé avec docker-compose. C'est un long message (désolé !).
Voici mon fichier docker-compose.yml :
db:
image: mysql:5.7
ports:
- "3306:3306" # I have tried both ports and expose "3306". Still doesn't work
environment:
- MYSQL_ROOT_PASSWORD="secret"
- MYSQL_USER="django"
- MYSQL_PASSWORD="secret"
- MYSQL_DATABASE="myAppDB"
Ensuite :
$> docker-compose build
db uses an image, skipping #expected!
$> docker-compose up
<<LOTS OF OUTPUT>>
OK, donc maintenant j'ai un conteneur docker opérationnel qui exécute mysql:5.7. Super ! Ou pas ? Lorsque je teste dans mon application django, je reçois des erreurs opérationnelles disant que l'utilisateur n'est pas autorisé à se connecter à la base de données. Ok, peut-être que c'est mon django alors ?
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7216f99ca0f mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp sharpfin_db_1
$> docker-machine ip dev
192.168.99.100
$> mysql -h 192.168.99.100 -P 3306 -u django -p
Enter password:
ERROR 1045 (28000): Access denied for user 'django'@'192.168.99.1' (using password: YES)
ok alors peut-être que c'est quelque chose à faire avec la connexion au conteneur docker-compose ? Et si j'essaie de me connecter depuis l'intérieur du conteneur docker ?
$> docker exec -it c7216f99ca0f /bin/bash
root@c7216f99ca0f:/#
root@c7216f99ca0f:/# mysql -u django -p
Enter password:
ERROR 1045 (28000): Access denied for user 'django'@'localhost' (using password: YES)
ok, donc docker mysql ne me laisse pas me connecter, je ne sais pas pourquoi. Voyons ce qui se passe quand j'essaie de faire ça sans docker-compose :
$> docker run --name run-mysql -e MYSQL_ROOT_PASSWORD="secret" -e MYSQL_USER="django" -e MYSQL_PASSWORD="secret" -e MYSQL_DATABASE="myAppDB" -p "3306:3306" mysql:5.7
<<LOTS OF OUTPUT SAME AS BEFORE>>
Ok, donc maintenant nous avons un conteneur qui exécute la même image que précédemment avec les mêmes paramètres. (Je pense que cette affirmation est probablement fausse - docker-compose fait quelque chose de différent de docker run).
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73071b929e82 mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp run-mysql
Il y a mon conteneur (appelé run-mysql). Connectons nous !
$> mysql -h 192.168.99.100 -P 3306 -u django -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myAppDB |
+--------------------+
2 rows in set (0.01 sec)
mysql>
Très bien. Je peux me connecter. C'est bizarre... Et depuis l'intérieur du conteneur ?
$> docker exec -it 73071b929e82 /bin/bash
root@73071b929e82:/# mysql -u django -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myAppDB |
+--------------------+
2 rows in set (0.00 sec)
mysql>
Ok, je peux me connecter depuis l'extérieur et l'intérieur du conteneur lorsque je le lance avec docker run, mais pas avec docker-compose. Qu'est-ce qui se passe ? Il doit y avoir quelque chose que docker-compose fait en coulisse qui change la façon dont la base de données est initialisée.
Tout ce qui précède est exactement le même si j'essaie avec l'utilisateur Root également. Il ne s'agit donc pas d'un problème de permissions avec l'utilisateur django.
Une idée pour résoudre ce problème ?