44 votes

la connexion à un conteneur mysql de docker-compose refuse l'accès mais docker exécutant la même image ne le fait pas

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 ?

33voto

Wallace Points 326

Variables d'environnement dans docker-compose.yml ne doit pas comporter de guillemets lorsqu'il utilise une définition de tableau :

db:
  image: mysql:5.7
  ports:
    - "3306:3306"
  environment:
    - MYSQL_ROOT_PASSWORD=secret
    - MYSQL_USER=django
    - MYSQL_PASSWORD=secret
    - MYSQL_DATABASE=myAppDB

Si vous les utilisez dans votre docker-compose.yml fichier :

db:
  image: mysql:5.7
  ports:
    - "3306:3306"
  environment:
    - MYSQL_ROOT_PASSWORD="secret"
    - MYSQL_USER="django"
    - MYSQL_PASSWORD="secret"
    - MYSQL_DATABASE="myAppDB"

et courir :

$ docker-compose up -d

et entrez dans le conteneur en cours d'exécution :

$ docker-compose exec -it db /bin/bash

vous verrez la sortie :

root@979813643b0c:/# echo $MYSQL_ROOT_PASSWORD                                                                                                                                              
"secret"

16voto

threeve Points 1847

J'utilise l'image mysql officielle avec docker-compose et je n'ai pas de problème. La seule différence dans mon fichier compose est que j'utilise un dictionnaire au lieu d'un tableau :

environment:
  MYSQL_ROOT_PASSWORD: secret
  MYSQL_USER: django
  MYSQL_PASSWORD: secret
  MYSQL_DATABASE: myAppDB

J'ai remarqué que la documentation du fichier de composition est toujours bloquée en V1 à certains endroits, donc vous pouvez essayer ceci, si vous utilisez V2. Sinon, pour le débogage, vous pouvez utiliser docker-compose exec pour interagir directement avec le conteneur créé par compose.

docker-compose exec db /bin/bash vous obtiendra un shell sur le conteneur qui vous pose problème et vous pourrez vérifier des choses comme SHOW GRANTS FOR django@'%' ou si les ports sont transférés correctement. J'espère que cela vous aidera.

12voto

Susei Points 941

J'ai eu un problème similaire, et ceci m'a aidé :

https://github.com/docker-library/mysql/issues/51#issuecomment-76989402

Avez-vous changé les mots de passe depuis que vous avez essayé d'exécuter les conteneurs pour la première fois ? docker-compose fait un travail supplémentaire pour préserver les volumes entre les exécutions (préservant ainsi la base de données) ; vous pouvez essayer de docker-compose rm -v pour tout effacer et essayer de le redémarrer.

1voto

gyr9i Points 11

J'ai eu la même erreur "Access denied for user 'admin'@'172.20.0.1' (using password : YES)". Et pendant longtemps, je n'ai pas pu trouver comment le résoudre. Dans mon cas, doker-compose prend la configuration du fichier .env.

environment:
  MYSQL_DATABASE: ${DB_DATABASE}
  MYSQL_USER: ${DB_USERNAME}
  MYSQL_PASSWORD: ${DB_PASSWORD}
  MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

J'ai enfin trouvé le problème ! Le problème se situait au niveau des quots doubles dans les paramètres.

DB_PASSWORD="dbpassword"

ne fonctionne pas

DB_PASSWORD=dbpassword

travail

0voto

HankCa Points 176

Il semble que votre problème soit résolu. Je pensais discuter de mes problèmes similaires à celui-ci.

Je fais tourner tomcat (web) et mysql (db) en utilisant docker-compose sur un NAS Synology (DSM 6.0.2). Cela a bien fonctionné sur une boîte Ubuntu que j'ai mais pas sur le NAS.

Le problème venait du pare-feu du NAS. J'avais modifié mes règles de pare-feu pour autoriser l'ouverture de certains ports, mais en les refusant tous à la fin. Lorsque j'ai ajouté :3306 aux ports autorisés, cela a fonctionné !

Ce n'est pas une bonne solution et je ne sais pas pourquoi DSM l'exige puisque le docker-compose fonctionne sur un réseau BRIDGE. J'ai créé un ticket de support à ce sujet.

Cette réponse peut aider d'autres personnes confrontées à ce problème de conteneur bloqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X