[英]Cannot connect to MySQL from python on docker-compose
我正在尝试为使用 mysql 运行的烧瓶应用程序构建一个 docker-compose。 问题是:我的烧瓶无法访问 mysql(都在 docker-compose 中)并不断返回此问题: pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")
。
所以我决定编写一个简单的烧瓶应用程序并将连接复制到mysql。 docker-compose 上的 Flask 应用程序单独运行良好,mysql 也运行良好,因为我可以在 dbeaver 中编写查询。 但是,当我尝试在脚本中连接到 mysql 时,它会引发错误: connection = pymysql.connect(host='127.0.0.1')
与我上面提到的类似错误
代码在遇到host=127.0.0.1
时会立即中断。
这是我的 app.py:
from flask import Flask
import pymysql
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Login</h1>'
if __name__ == '__main__':
connection = pymysql.connect(host='127.0.0.1',
user='root',
password='password',
port=33061,
cursorclass=pymysql.cursors.DictCursor)
cur = connection.cursor()
cur.execute(''' SELECT * FROM data_warehouse.ofactory_results''')
order_no = cur.fetchone()
print(order_no)
print('STARTTTTTTT!')
app.run(debug=True)
这是我的码头工人撰写:
version: "3.9"
services:
app:
build:
context: .
ports:
- 5000:5000
mysql_db:
container_name: mysql_db
image: mariadb:latest
restart: always
ports:
- "0.0.0.0:33061:3306"
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=data_warehouse
- MYSQL_USER=debezium
- MYSQL_PASSWORD=debezium
volumes:
- ./mysql:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
这是我的码头文件:
FROM python:3.9
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
这是错误:
Traceback (most recent call last):
prep-app-1 | File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 613, in connect
prep-app-1 | sock = socket.create_connection(
prep-app-1 | File "/usr/local/lib/python3.9/socket.py", line 844, in create_connection
prep-app-1 | raise err
prep-app-1 | File "/usr/local/lib/python3.9/socket.py", line 832, in create_connection
prep-app-1 | sock.connect(sa)
prep-app-1 | ConnectionRefusedError: [Errno 111] Connection refused
prep-app-1 |
prep-app-1 | During handling of the above exception, another exception occurred:
prep-app-1 |
prep-app-1 | Traceback (most recent call last):
prep-app-1 | File "//app.py", line 10, in <module>
prep-app-1 | connection = pymysql.connect(host='127.0.0.1',
prep-app-1 | File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 353, in __init__
prep-app-1 | self.connect()
prep-app-1 | File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 664, in connect
prep-app-1 | raise exc
prep-app-1 | pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")
prep-app-1 exited with code 1
docker 容器内的 localhost != 主机的 localhost。
您可以使用:
connection = pymysql.connect(host='mysql_db',
user='root',
password='password',
port=3306,
cursorclass=pymysql.cursors.DictCursor)
注意mysql_db
这是您的数据库服务的名称。 Docker,在内部会将该名称解析为 docker 网络中的容器 IP 地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.