【问题标题】:Can't connect dockerized mysql container from flask app无法从烧瓶应用程序连接 dockerized mysql 容器
【发布时间】:2022-01-25 15:28:40
【问题描述】:

我正在尝试使用烧瓶和 mysql 制作一个 dockerized 应用程序。

但我在 Flask-SQLAlchemy 上使用 exec db.create_all() 时遇到错误。

我已经确认可以连接以下。

您能告诉我是否还有其他设置错误吗?

mysql -h 127.0.0.1 -u root -P 3306 -p flask_db
Enter password:
mysql> 
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from .views import api
from datetime import datetime

app = Flask(__name__)
app.config.update(
    SQLALCHEMY_DATABASE_URI = "mysql://root:flask-db@127.0.0.1:3306/flask_db",
    SQLALCHEMY_TRACK_MODIFICATIONS = False,
)
db = SQLAlchemy(app)
app.register_blueprint(api)

class User(db.Model):
  __tablename__ = 'users'

  id = db.Column(db.Integer, primary_key=True)
  created_at = db.Column(db.DateTime, nullable=False, default=datetime.now())
  updated_at = db.Column(db.DateTime, nullable=False, default=datetime.now(), onupdate=datetime.now())

  def __init__(self, name):
    self.name = name
root@c8676d815528:/api# flask shell
Python 3.9.9 (main, Dec 21 2021, 07:09:55) 
[GCC 8.3.0] on linux
App: app [development]
Instance: /api/instance
>>> from app import db
>>> db
<SQLAlchemy engine=mysql://root:***@127.0.0.1:3306/flask_db?charset=utf8>
>>> db.create_all()
...
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2002, "Can't connect to MySQL server on '127.0.0.1' (115)")

我用的是mysqlclient,所以我也试了下,结果一样。

SQLALCHEMY_DATABASE_URI = "mysql+mysqldb://root:flask-db@127.0.0.1/flask_db"
.
├── Dockerfile
├── README.md
├── app
│   ├── __init__.py
│   ├── models.py
│   └── views.py
├── db
│   └── mysql
│       └── volumes
├── docker-compose.yml
├── requirements.txt
version: "3.8"
services:
  db:
    platform: linux/x86_64
    image: mysql:8.0.27
    container_name: flask-backend-db
    environment:
      MYSQL_ROOT_PASSWORD: flask-db
      MYSQL_PASSWORD: flask-db
    ports:
      - "3306:3306"
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql
  api:
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: flask-backend
    command: bash -c "flask run --host=0.0.0.0 --port=80"
    volumes:
      - .:/api
    ports:
      - "5000:80"
    depends_on:
      - db

版本

  • Python:3.9.9
  • 烧瓶:2.0.2
  • MySQL:8.0.27

【问题讨论】:

  • "SQLALCHEMY_DATABASE_URI = "mysql://root:flask-db@127.0.0.1:3306/flask_db"" - 我们需要使用数据库容器的名称作为数据库主机:SQLALCHEMY_DATABASE_URI = "mysql://root:flask-db@fask-backend-db:3306/flask_db"。适当的解决方法是将配置外部化 (3rd factor of a 12factor app)。

标签: python mysql docker flask flask-sqlalchemy


【解决方案1】:

谢谢你,Turing85! 我错了一个简单的 docker 配置。

SQLALCHEMY_DATABASE_URI = "mysql://root:flask-db@127.0.0.1:3306/flask_db",

SQLALCHEMY_DATABASE_URI = "mysql://root:flask-db@flask-backend-db:3306/flask_db",

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多