python - 在 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 进行手动连接时,它可以正常工作。
解决方案
推荐阅读
- kentico - Kentico 12 - 按给定页面类型限制页面选择器
- javascript - 如何使用淡入淡出改变图像
- sql - 如何从 SQL Server 2014 中的“\”等多个分隔符中提取子字符串?
- javafx - 如何使此 JavaFX 绑定多次触发?
- mapbox - Mapbox flyTo动画在桌面浏览器上不起作用
- javascript - 使用 Ramda 根据键名模式对数组对象进行乘法和变换。在新的平面数组中返回所有内容
- android - 将协程与分页库一起使用时未分派数据
- java - Spring Boot:通过更改标志在嵌入式和 postgresql 数据源之间切换
- laravel - 在一个域或子域上托管两个 Laravel 项目?
- firebase - 我如何将firebase输出更改为具有本机反应的文本,从我现在所拥有的