首页 > 解决方案 > 在 docker 上使用 Flask-SQLAlchemy 和 mysql 进行连接

问题描述

当我使用桌面环境时,我有一个可以正常工作的应用程序。但是,当我放入 docker 环境时,会返回以下错误:

BrokenFilesystemWarning)
172.19.0.1 - - [31/May/2019 12:43:18] "GET /data/ HTTP/1.1" 500 -
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.6/dist-packages/flask_socketio/__init__.py", line 43, in __call__
start_response)
File "/usr/local/lib/python3.6/dist-packages/engineio/middleware.py", line 67, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.6/dist-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.6/dist-packages/flask/_compat.py", line 35, in reraise
raise value
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
 File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.6/dist-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.6/dist-packages/flask/_compat.py", line 35, in reraise
 raise value
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.6/dist-packages/flask_cors/decorator.py", line 128, in wrapped_function
resp = make_response(f(*args, **kwargs))
File "/tmp/app/views/main.py", line 63, in data
bd_data = get_db_data()
File "/tmp/app/views/main.py", line 81, in get_db_data
conn = MySQLdb.connect(user="root", passwd="root", db="test")
File "/usr/local/lib/python3.6/dist-packages/MySQLdb/__init__.py", line 85, in Connect
return Connection(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/MySQLdb/connections.py", line 204, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

这是 docker compose 的文件:

version: '3'
services:
    db:
        image: mysql
        container_name: container-db
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=test
        ports:
            - "3306:3306"
        volumes:
            - ./mysql:/var/lib/mysql
        networks:
            - app-tier
        restart: always 
    service:
        image: service-image
        container_name: container-service
        ports:
            - "8080:8080"
        entrypoint: ["./wait-for-it.sh","db:3306","--timeout=0","--strict","--","python","run.py"]
        depends_on:
            - db
        networks:
            - app-tier
        restart: always
        environment:
            DB_HOST: db:3306
            YOLO_VERSION: v2
    app:
        image: view-image
        container_name: container-view-app
        ports:
            - "80:80"
        depends_on:
            - service
        networks:
            - app-tier
        restart: always
networks:
  app-tier:
    driver: bridge

以及我传递给 SQLAlchemy 的变量:

DB_USERNAME = 'root'
DB_PASSWORD = 'root'
DB_NAME = 'test'

DB_HOST = str(os.environ.get('DB_HOST'))
YOLO_VERSION = str(os.environ.get('YOLO_VERSION'))


SQLALCHEMY_DATABASE_URI = 'mysql://' + DB_USERNAME + ':' + DB_PASSWORD + '@'+DB_HOST+'/' + DB_NAME

我怀疑容器之间可能存在一些连接问题,但是当我访问服务容器并使用 mysql.connect 进行手动连接时,它可以正常工作。

标签: pythondockerflaskdocker-composeflask-sqlalchemy

解决方案


推荐阅读