web-dev-qa-db-fra.com

la connexion à un conteneur mysql docker-compose refuse l’accès, mais pas le menu fixe qui exécute la même image

J'ai des problèmes de connexion au conteneur mysql que j'ai lancé avec docker-compose. C'est un long post (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, alors maintenant j'ai un coureur de conteneur docker en marche, mysql: 5.7. Génial! Ou est-ce? Lorsque je teste dans mon Django, je reçois des erreurs opérationnelles indiquant que l'utilisateur n'est pas autorisé à se connecter à la base de données. Ok, alors c'est peut-être 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 à voir avec la connexion au conteneur docker-compose? Et si j'essaie de me connecter depuis l'intérieur du conteneur de 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 laissera pas me connecter, je ne sais pas pourquoi. Voyons ce qui se passe lorsque j'essaie de le faire 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, nous avons maintenant un conteneur qui exécute la même image que précédemment avec les mêmes paramètres. (Je pense que cette affirmation n'est probablement pas vraie - docker-compose fait quelque chose de différent de l'exécution de docker).

$> 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>

Bien. Vous pouvez vous connecter. C'est bizarre ... Qu'en est-il de 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 lance Docker, mais pas avec Docker-Compose. Que se passe-t-il? Il doit y avoir quelque chose que docker-compos est en train de faire en arrière-plan qui modifie 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 également avec l'utilisateur root. Donc ce n’est pas un problème d’autorisations avec l’utilisateur Django.

Des idées comment résoudre ceci?

39
Davy Kavanagh

Les variables d'environnement dans le fichier docker-compose.yml Ne doivent pas avoir de guillemets lors de l'utilisation d'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 fichier docker-compose.yml:

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 le conteneur courant:

$ docker-compose exec db /bin/bash

vous verrez la sortie:

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

J'utilise l'image mysql officielle avec docker-compose et je n'ai pas de problème. La seule différence dans mon fichier de composition 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 dans la V1 à certains endroits. Vous pouvez donc essayer ceci si vous utilisez la V2. Sinon, vous pouvez utiliser docker-compose exec pour interagir avec le conteneur créé par compos directement.

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

16
threeve

J'ai eu un problème similaire, et cela 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? docker-compose effectue un travail supplémentaire pour conserver les volumes entre les exécutions (préservant ainsi la base de données); vous voudrez peut-être essayer docker-compose rm -v pour tout supprimer et essayez de le redémarrer.

11
gvlasov

J'ai eu la même erreur "Accès refusé pour l'utilisateur 'admin'@'172.20.0.1' (en utilisant un mot de passe: OUI)". Et pendant longtemps, je ne savais pas comment le résoudre. Dans ma situation, 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}

Enfin j'ai trouvé le problème! Le problème était en double quots dans les paramètres.

DB_PASSWORD="dbpassword"

ne fonctionne pas

DB_PASSWORD=dbpassword

travail

1
gyr9i

Il semble que votre problème soit résolu. Je pensais que je discuterais de mes problèmes de la même façon.

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

Le problème était le pare-feu sur le NAS - J'avais modifié mes règles de pare-feu pour autoriser l'ouverture de certains ports, puis DENY ALL à 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 aurait besoin de cela, puisque la composition de docker est exécutée sur un réseau BRIDGE. J'ai mis un ticket d'assistance à ce sujet.

Cette réponse peut aider les autres à résoudre ce problème de conteneur bloqué.

0
HankCa