gpt4 book ai didi

docker - 使用 docker-compose 从 Flask 应用程序连接到 MySQL

转载 作者:行者123 更新时间:2023-12-04 19:29:38 24 4
gpt4 key购买 nike

我有一个使用 Flask 和 MySQL 的应用程序。该应用程序不会从 Flask 应用程序连接到 MySQL 容器,但可以使用 Sequel Pro 使用相同的凭据访问它。

Docker 撰写文件

version: '2' 
services:
web:
build: flask-app
ports:
- "5000:5000"
volumes:
- .:/code
mysql:
build: mysql-server
environment:
MYSQL_DATABASE: test
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: 0.0.0.0
MYSQL_USER: testing
MYSQL_PASSWORD: testing
ports:
- "3306:3306"

MySQL 的 Docker 文件

MySQL 的 docker 文件将从 test.dump 添加模式文件。
FROM mysql/mysql-server
ADD test.sql /docker-entrypoint-initdb.d

Flask 的 Docker 文件
FROM python:latest
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]

起点app.py
from flask import Flask, request, jsonify, Response
import json
import mysql.connector
from flask_cors import CORS, cross_origin

app = Flask(__name__)

def getMysqlConnection():
return mysql.connector.connect(user='testing', host='0.0.0.0', port='3306', password='testing', database='test')

@app.route("/")
def hello():
return "Flask inside Docker!!"

@app.route('/api/getMonths', methods=['GET'])
@cross_origin() # allow all origins all methods.
def get_months():
db = getMysqlConnection()
print(db)
try:
sqlstr = "SELECT * from retail_table"
print(sqlstr)
cur = db.cursor()
cur.execute(sqlstr)
output_json = cur.fetchall()
except Exception as e:
print("Error in SQL:\n", e)
finally:
db.close()
return jsonify(results=output_json)

if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0')

当我在 http://localhost:5000/ 上执行 GET 请求时使用 REST Client 我得到一个有效的响应。
http://localhost:5000/api/getMonths 上的 GET 请求给出错误信息:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '0.0.0.0:3306' (111 Connection refused)

在 Sequel Pro 上使用相同的凭据时,我能够访问数据库。
enter image description here

请建议我如何从 Flask 应用程序连接 MySQL 容器。这是我第一次起诉 Docker,如果这是我的一个愚蠢的错误,请原谅我。

最佳答案

改变这个

return mysql.connector.connect(user='testing', host='0.0.0.0', port='3306', password='testing', database='test')


return mysql.connector.connect(user='testing', host='mysql', port='3306', password='testing', database='test')

您的代码在容器内运行,而不是在您的主机上运行。因此,您需要为其提供一个可以在容器网络中访问的地址。对于 docker-compose每个服务都可以使用其名称访问。所以在你是 mysql因为这是您用于该服务的名称

关于docker - 使用 docker-compose 从 Flask 应用程序连接到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45658144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com