如何将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
相关产品推荐
相关产品推荐

