【问题标题】:Cannot connect to MySql in Docker. Access Denied Error thrown. Flask-SqlAlchemy无法连接到 Docker 中的 MySql。抛出拒绝访问错误。 Flask-SqlAlchemy
【发布时间】:2017-01-03 11:04:15
【问题描述】:

好的,所以已经尝试了一段时间来让它工作。这是我从头到尾运行的命令行,我得到一个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)")

这里是回购https://github.com/Amertz08/flask-docker

看起来 SqlAlchemy 引擎没有查看正确的容器。 'flask-docker'@'flaskdocker_web_1.flaskdocker_default' 是错误中显示的内容。

也许我没有正确理解它,但我在我的 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

然后在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
)

对此的任何帮助将不胜感激。

【问题讨论】:

  • 您已将容器与名称 mysql 关联。您无需将其称为flask_docker。此外,您可以只说mysql 而不是mysql:mysql。仅当您使用不同名称(例如,mysql:flask_docker)映射容器时才需要后一种形式。
  • 有效点。已更改,谢谢!

标签: python docker flask flask-sqlalchemy docker-compose


【解决方案1】:

看来问题出在哪里:

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

但是你使用mysql作为flask-docker'@'flaskdocker_web_1.flaskdocker_default用户。

为解决这个问题,为flask-docker'@'flaskdocker_web_1.flaskdocker_default用户授予用户权限

【讨论】:

  • 这似乎可以解决问题。谢谢。
【解决方案2】:

我将在这里添加另一个解决方案,因为我遇到了这个问题。为了让我能够从 Flask 访问数据库,我使用了 mysql-connector(可以通过 pip install mysql-connector 安装),进入 mysql shell 并运行以下代码 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

然后我使用以下配置连接到 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)

我仍然不太确定为什么需要这种解决方法,因为我之前从未在任何其他 Python 应用程序中有意使用过它,但它似乎确实可以与 libmysqlclient 一起使用。

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

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2021-05-23
    • 2019-02-04
    • 2023-03-21
    相关资源
    最近更新 更多