简体   繁体   English

无法连接到Docker中的MySql。 拒绝访问拒绝错误。 烧瓶的SQLAlchemy

[英]Cannot connect to MySql in Docker. Access Denied Error thrown. Flask-SqlAlchemy

Alright so been trying for a while to get this to work. 好吧,所以一直尝试让这个工作。 Here is the line of commands I run from start to finish and I get an Access denied... error shown below. 这是我从头到尾运行的命令行,我得到一个Access denied...错误,如下所示。

$ docker-compose up --build -d
$ docker exec -it flaskdocker_mysql_1 mysql -u root -p
mysql> CREATE DATABASE flask_docker;
mysql> CREATE USER `flask-docker`@`localhost` IDENTIFIED BY 'pass';
mysql> GRANT ALL PRIVILEGES ON flask_docker.* TO 'flask-docker'@'localhost';
mysql> exit
Bye
$ docker exec -it flaskdocker_web_1 python /usr/src/app/manage.py createdb
# rest of traceback
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user 'flask-docker'@'flaskdocker_web_1.flaskdocker_default' (using password: YES)")

Here is the repo https://github.com/Amertz08/flask-docker 这是repo https://github.com/Amertz08/flask-docker

It looks like the SqlAlchemy engine is not looking at the right container. 看起来SqlAlchemy引擎没有查看正确的容器。 'flask-docker'@'flaskdocker_web_1.flaskdocker_default' is what shows up in the error. 'flask-docker'@'flaskdocker_web_1.flaskdocker_default'出现在错误中。

Maybe I am not understanding it right but I linked mysql:mysql in my docker-compose.yml file 也许我不理解它,但我在我docker-compose.yml文件中链接了mysql:mysql

web:
    restart: always
    build: ./app
    volumes:
      - /usr/src/app/static
    expose:
      - "5000"
    environment:
      FLASK_CONFIG: 'production'
    links:
      - mysql:mysql
    command: /usr/local/bin/uwsgi --ini uwsgi.ini

Then in my config object in config.py I have the following... 然后在config.py中的配置对象中,我有以下内容......

MYSQL_USER = 'flask-docker'
MYSQL_PASS = 'pass'
MYSQL_HOST = 'mysql'
MYSQL_DB = 'flask_docker'
# Database info
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{usr}:{passwd}@{host}/{db}'.format(
    usr=MYSQL_USER, passwd=MYSQL_PASS, host=MYSQL_HOST, db=MYSQL_DB
)

Any help on this would be greatly appreciated. 任何有关这方面的帮助将不胜感激。

It seems the problem there: 看来那里的问题是:

mysql> GRANT ALL PRIVILEGES ON flask_docker.* TO 'flask-docker'@'localhost'; You grant privileges for localhost user 您为localhost用户授予权限

But you use mysql as flask-docker'@'flaskdocker_web_1.flaskdocker_default user. 但是你使用mysql作为flask-docker'@'flaskdocker_web_1.flaskdocker_default用户。

To solve this grant user privileges for flask-docker'@' flaskdocker_web_1.flaskdocker_default user 要为flask-docker'@'flaskdocker_web_1.flaskdocker_default用户解决此授予用户权限

I'll add another solution here as I had a difficult time with this problem. 我会在这里添加另一个解决方案,因为我遇到了这个问题。 In order for me to get access to the database from Flask I used mysql-connector (can be installed via pip install mysql-connector ), entered the mysql shell and ran the following code ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; 为了让我从Flask访问数据库,我使用了mysql-connector (可以通过pip install mysql-connector ),进入mysql shell并运行以下代码ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

I then connected to mysql using the following config: 然后我使用以下配置连接到mysql:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from .db import db

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://root:foo@127.0.0.1:3306/bar_db'
db = SQLAlchemy(app)

I'm still not quite sure why this work around was needed as I've never knowingly used it before in any other Python application however it does appear to work with libmysqlclient. 我仍然不太确定为什么需要这个工作,因为我之前从未故意在任何其他Python应用程序中使用它,但它确实似乎与libmysqlclient一起使用。

src: https://dev.mysql.com/doc/refman/8.0/en/native-pluggable-authentication.html src: https//dev.mysql.com/doc/refman/8.0/en/native-pluggable-authentication.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM