You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flask应用容器与MySQL数据库容器连通?

Flask容器与MySQL容器连通配置方案

问题说明

需通过两个独立容器搭建Flask应用与MySQL数据库的连接,使用flask_mysqldb库开发,现有项目包含App(Flask应用)和db(MySQL数据库)两个目录,已配置docker-compose、Dockerfile、连接代码及db.yaml,需实现容器间连通。

项目结构

---docker-compose
     App
      |
      |--app.py
      |--dockerfile
     db
      |
      |--dockerfile
      |--db.sql 

现有配置文件

docker-compose.yml

version: '2'
services:
  pythonapp:
    build: ./NewtestPythonProject
    command: sh -c "sleep 10s ; python3 ./main.py"
    ports:
    - '5000:5000'
    depends_on:
      - mysql
      
  mysql:
    build: ./MyDbDockerFile
    restart: always
    environment:
        MYSQL_DATABASE: 'profile'
        MYSQL_ROOT_PASSWORD: '1234'
    ports:
      - '3306:3306'

数据库Dockerfile(db/dockerfile)

FROM mysql:latest
COPY ./dcs.sql /docker-entrypoint-initdb.d/

应用Dockerfile(App/dockerfile)

FROM python:3.9

WORKDIR /usr/app/src

COPY . /usr/app/src/

RUN pip3 install -r requirements.txt

EXPOSE 5000

数据库连接代码(App/app.py)

from flask import *
from flask_mysqldb import MySQL
import yaml,re 
import MySQLdb.cursors
from passlib.hash import pbkdf2_sha256

app = Flask(__name__)
app.secret_key = 'This'
#-----------------------------database connection-----------
db = yaml.load(open("db.yaml"),Loader=yaml.FullLoader)
app.config["MYSQL_HOST"] =  db['mysql_host']
app.config["MYSQL_USER"] =  db['mysql_user']
app.config["MYSQL_PASSWORD"] =  db['mysql_password']
app.config["MYSQL_DB"] =  db['mysql_db']

MySQL = MySQL(app)

db.yaml(App/db.yaml)

mysql_host: "localhost"
mysql_user: "root"
mysql_password: "1234"
mysql_db: "profile"

修复步骤

1. 修正数据库连接地址

在App/db.yaml中,将mysql_host的值从localhost改为mysql——Docker Compose会自动为同一网络内的服务创建DNS解析,服务名mysql即可直接指向数据库容器:

mysql_host: "mysql"
mysql_user: "root"
mysql_password: "1234"
mysql_db: "profile"

2. 修正docker-compose.yml中的路径与启动命令

  • 调整build路径,对应实际项目结构中的App和db目录
  • 启动命令中的main.py改为实际的app.py
version: '2'
services:
  pythonapp:
    build: ./App
    command: sh -c "sleep 10s ; python3 ./app.py"
    ports:
    - '5000:5000'
    depends_on:
      - mysql
      
  mysql:
    build: ./db
    restart: always
    environment:
        MYSQL_DATABASE: 'profile'
        MYSQL_ROOT_PASSWORD: '1234'
    ports:
      - '3306:3306'

3. 修正数据库初始化SQL文件路径

在db/dockerfile中,将dcs.sql改为实际存在的db.sql,确保容器启动时能正确执行初始化脚本:

FROM mysql:latest
COPY ./db.sql /docker-entrypoint-initdb.d/

4. (可选)优化启动等待逻辑

sleep 10s是简单的等待方式,但更可靠的是利用Docker的健康检查,确保数据库完全启动后再启动Flask应用:
修改docker-compose.yml中的mysql服务,添加健康检查:

mysql:
  build: ./db
  restart: always
  environment:
      MYSQL_DATABASE: 'profile'
      MYSQL_ROOT_PASSWORD: '1234'
  ports:
    - '3306:3306'
  healthcheck:
    test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-p1234"]
    timeout: 20s
    retries: 10

然后修改pythonapp的配置,依赖数据库的健康状态:

pythonapp:
  build: ./App
  command: python3 ./app.py
  ports:
  - '5000:5000'
  depends_on:
    mysql:
      condition: service_healthy

完成以上修改后,执行docker-compose up --build即可启动两个容器并实现连通。

内容的提问来源于stack exchange,提问作者user9778557

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:50:25