conectarse a un contenedor docker-compose mysql deniega el acceso, pero docker ejecutando la misma imagen no


Tengo algunos problemas para conectarme al contenedor de docker de mysql que he lanzado con docker-compose. Este es un post largo (lo siento!).

Aquí está mi docker-compose.archivo 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"

Entonces:

$> docker-compose build
db uses an image, skipping #expected!
$> docker-compose up
<<LOTS OF OUTPUT>>

OK, así que ahora tengo un ejecutable docker container runner mysql:5.7. ¡Órale! ¿O lo es? Al probar en mi aplicación django, recibo errores operativos que dicen que el usuario no puede conectar la base de datos. Ok, entonces tal vez sea mi django?

$> 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 so tal vez es algo que ver con la conexión al contenedor docker-compose? ¿Qué pasa si intento conectarme desde el interior del contenedor 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, así que docker mysql no me deja conectar, no sé por qué. Veamos qué sucede cuando intento hacer esto sin 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, ahora tenemos un contenedor que ejecuta la misma imagen que antes con la misma configuración. (Creo que esta afirmación probablemente no es cierta - docker-compose está haciendo algo diferente a docker ejecutar).

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

Ahí está mi contenedor (llamado run-mysql). ¡Conectemos!

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

Muy bien. Puede iniciar sesión. Eso es raro... ¿Qué hay del interior del contenedor?

$> 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, puedo iniciar sesión desde fuera y dentro del contenedor cuando inicie con docker run, pero no con docker-compose. ¿Qué está pasando? Debe haber algo que docker-compose esté haciendo entre bastidores que cambie la forma en que se inicializa la base de datos.

Todo lo anterior es exactamente lo mismo si intento con el usuario root también. Así que no es un problema de permisos con el usuario django.

Alguna idea de cómo resolver esto?

Author: Davy Kavanagh, 2016-05-26

5 answers

Las variables de entorno en el archivo docker-compose.yml no deben tener comillas cuando se usa la definición de matriz:

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

Si los usas en tu archivo 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"

Y ejecutar:

$ docker-compose up -d

E ingrese el contenedor en ejecución:

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

Verás la salida:

root@979813643b0c:/# echo $MYSQL_ROOT_PASSWORD                                                                                                                                              
"secret"
 20
Author: Wallace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-27 12:43:37

Estoy usando la imagen oficial de mysql con docker-compose y no tengo ningún problema. La única diferencia en mi archivo de composición es que estoy usando un diccionario en lugar de una matriz:

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

He notado que la documentación del archivo de redacción todavía está atascada en V1 en algunos lugares, por lo que podría probar esto, si está utilizando V2. De lo contrario, para la depuración puede usar docker-compose exec para interactuar con el contenedor creado por compose directamente.

docker-compose exec db /bin/bash te dará una cáscara en el contenedor que le está dando problemas y puede comprobar cosas como SHOW GRANTS FOR django@'%' o si los puertos se están reenviando correctamente. Espero que esto ayude.

 13
Author: threeve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 12:37:26

Tuve un problema similar, y esto me ayudó:

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

¿Ha cambiado las contraseñas desde que intentó ejecutar los contenedores por primera vez? docker-compose hace un trabajo extra para preservar los volúmenes entre corridas (preservando así la base de datos); puede intentar docker-compose rm -v eliminar todo e intentar iniciarlo de nuevo.

 7
Author: gvlasov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-21 04:14:17

Parece que su problema está resuelto. Pensé en discutir mis problemas similares a esto.

Estoy ejecutando tomcat (web) y mysql (db) utilizando docker-compose en un NAS de Synology (DSM 6.0.2). Funcionó bien en una caja de Ubuntu que tengo, pero no en el NAS.

El problema era el firewall en el NAS: había modificado mis reglas de firewall para permitir que ciertos puertos se abrieran, pero luego NEGARLO TODO al final. Cuando agregué: 3306 a los puertos permitidos funcionó!

Esta no es una buena solución y No se por qué DSM requeriría esto ya que docker-compose se está ejecutando en una red BRIDGE. He puesto un ticket de soporte sobre esto.

Esta respuesta puede ayudar a otros con este problema de contenedor bloqueado.

 0
Author: HankCa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-21 01:43:10

Tuve el mismo error "Acceso denegado para el usuario 'admin'@'172.20.0.1' (usando contraseña: SÍ)". Y durante mucho tiempo no podía encontrar la manera de resolverlo. En mi situación doker-compose toma configuración de .archivo env.

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

Finalmente he encontrado problema! El problema estaba en quots dobles en parámetros.

DB_PASSWORD="dbpassword"

No funciona

DB_PASSWORD=dbpassword

Trabajo

 0
Author: gyr9i,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-27 14:38:25