【问题标题】:Docker Error 2002 SQLAlchemyDocker 错误 2002 SQLAlchemy
【发布时间】:2017-10-27 19:35:29
【问题描述】:

我目前正在使用 MySQL / SQLAlchemy 开发 Flask 应用程序。

我正在尝试对它进行 dockerize,但它在连接到其中一个套接字时遇到了一些问题。我已经查看了几乎所有关于此的问题,但我仍然收到此错误。

"sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)"

我目前正在研究 Mac 和 Mac 的终端程序。

我的文件夹树是: MainFolder -> .yml, db(文件夹), www(文件夹)

其中 db(f​​older) 有一个 Dockerfile,www(folder) 有 .py、requirements 和 Dockerfile

下面列出的是我的这个应用程序的代码。

docker-compose.yml

version: '3'
services: 
    www:
        build: www/.
        ports:
        - 5000:5000
        links:
        - db
        depends_on:
        - db

db:
    build: db/.
    volumes:
      - ./[database]:/usr/local/mysql
    environment:
      MYSQL_ROOT_PASSWORD: [password]

Dockerfile(用于 www)

FROM python:3-onbuild

# Place app in container
COPY . /opt/www
WORKDIR /opt/www

RUN pip3 install -r requirements.txt

EXPOSE 5000
CMD python index.py

用于 (db) 的 Dockerfile

# MySQL Container
FROM mysql:5.7.18

EXPOSE 3306
CMD ["mysqld"]

index.py

app = Flask(__name__)

# Configure your MySQL Connection
db = SQLAlchemy()
db_uri = 'mysql://root:password@localhost/[database]'
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)

class Database(db.Model):

    versionID = db.Column('versionID', db.Integer, primary_key=True)
    versionText = db.Column('versionText', db.String(500), 
    unique=False)

    def __init__(self, versionID, versionText):
        self.versionID = versionID
        self.versionText = versionText

    def serialize(self):
        return {
            'VersionID'     :   self.versionID,
            'VersionText'   :   self.versionText
        }

@app.route("/")
def test():
    return jsonify(json_list=[i.serialize for i in 
Database.query.all()])

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

我的输出应该以 JSON 的形式在浏览器中,如下所示:

{ json_list = [ 版本ID:一些ID 版本文本:someText ] }

类似的东西。

任何帮助表示赞赏!这几天一直在努力解决这个问题! 干杯

【问题讨论】:

    标签: python mysql docker flask sqlalchemy


    【解决方案1】:

    根据documentation,mysql启动时没有可以使用的数据库,除非你传递环境变量。

    将此添加到 docker-compose 文件中的 db 部分:

    MYSQL_DATABASE: name-of-database
    

    连接字符串应该是:

    'mysql://root:password@db/name-of-database'
    

    【讨论】:

    • 我认为您的解决方案可以避免 2002 错误,但现在它抛出 1146,“表 '[database].database' 不存在”
    • 你需要通过运行db.create_all()在数据库中创建表
    • 即使使用 create all 语句,它也会抛出 1146 错误。不过非常感谢。对 docker 来说还是新手,所以你的回答对我有点帮助!
    • 是的,这是我 2002 年错误的解决方案。我发现数据库缺失部分的错误!干杯!
    • 我的问题是我没有成功连接到 MySQL 容器。我放弃了 docker-compose 并构建了一个 MySQL 容器。然后,当我初始化我的 FlaskApplication 容器时,我确保将它链接到 MySQL 容器。 1146 错误的问题是我使用 docker-compose 构建的 FlaskContainer 没有在该容器中初始化 MySQL 数据库。我试图在本地连接到它,但要做到这一点,您必须在容器和本地数据库之间建立一座桥梁才能使其工作 - 我没有这样做
    【解决方案2】:

    根据你的 docker-compose 它是这样的:

    db_uri = 'mysql://root:password@db/[database]'
    

    【讨论】:

    • 我不太明白你在说什么。
    • 使用“db”而不是“localhost”连接到您的数据库。
    • 现在我得到一个未知的数据库“[数据库]”。错误代码 1049。嗯
    • 根据the documentation,mysql会自动创建一个与容器同名的新数据库,在你的情况下它是db所以字符串应该是'mysql://root:password@db/db'
    • @LuisOrduz 我明白了。我进行了更改,它说我的数据库是未知的。我在终端中运行 mysql 并“显示数据库”和它在那里。这意味着 Docker 没有将我的 [数据库] 迁移到容器中?
    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2012-04-27
    • 1970-01-01
    • 2016-04-06
    • 2017-06-25
    • 2015-01-23
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多