使用docker-compose从Flask Application连接到MySQL

Nik*_*aby 5 mysql-python docker docker-compose

我有一个使用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"
Run Code Online (Sandbox Code Playgroud)

MySQL的Docker文件

MySQL的docker文件将从test.dump文件中添加架构。

FROM mysql/mysql-server
ADD test.sql  /docker-entrypoint-initdb.d
Run Code Online (Sandbox Code Playgroud)

Flask的Docker文件

FROM python:latest
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]
Run Code Online (Sandbox Code Playgroud)

初始点 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')
Run Code Online (Sandbox Code Playgroud)

当我对http://localhost:5000/使用REST Client 进行GET请求时,得到一个有效的响应。

的GET请求http://localhost:5000/api/getMonths给出错误消息:

mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '0.0.0.0:3306' (111 Connection refused)
Run Code Online (Sandbox Code Playgroud)

在Sequel Pro上使用相同的凭据时,我可以访问数据库。 在此处输入图片说明

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

Tar*_*ani 7

改变这个

return mysql.connector.connect(user='testing', host='0.0.0.0', port='3306', password='testing', database='test')
Run Code Online (Sandbox Code Playgroud)

return mysql.connector.connect(user='testing', host='mysql', port='3306', password='testing', database='test')
Run Code Online (Sandbox Code Playgroud)

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