目标

一篇 docker-compose.yml 起 web + mysql,数据和图片都持久化,新机器一条命令恢复。

1. compose 文件

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: flask_blog
      MYSQL_USER: strli
      MYSQL_PASSWORD: goodXY99!
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      retries: 20
  web:
    build: .
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      FLASK_CONFIG: production
      DATABASE_URL: mysql+pymysql://strli:goodXY99!@mysql/flask_blog
      SECRET_KEY: xxx
      ADMIN_API_KEY: xxx
    ports:
      - "5000:5000"
    volumes:
      - ./app/static/uploads:/app/app/static/uploads
      - ./app/static/thumbnails:/app/app/static/thumbnails
      - ./app/static/drive:/app/app/static/drive
volumes:
  mysql_data:

2. entrypoint 初始化

#!/bin/sh
flask db upgrade
if [ -n "$ADMIN_USER" ]; then flask create-admin "$ADMIN_USER" "$ADMIN_PASS" || true; fi
exec uwsgi --http 0.0.0.0:5000 --module run:app --processes 5 --threads 2

对应你项目 run.py:create-admin 和 migrations/,避免新库没表。

3. 启动验证备份

docker compose up -d --build
docker compose logs -f web
docker compose exec mysql mysqldump -ustrli -pgoodXY99! flask_blog > backup.sql

检查前台列表、发文、封面缩略图 thumbnails/ 是否生成。下一篇进生产 Nginx。