内容纲要
一、配置信息:
1、linux:
Ubuntu 22.04 64 位
2、docker:
Docker version 25.0.5(阿里云源)
3、MySQL
8.0.36 / 8.0.37
4、postgresql:
15
注意的点:
镜像、应用的版本号要注意和固定
拉取镜像的国内来源都要写好
下载什么之前都要配置好来源地址
二、安装docker
三、上传项目并打包为镜像文件
改Dockerfile文件内容
FROM python:3.12-slim
WORKDIR /app
# 安装 uv(国内清华源)
RUN pip install --no-cache-dir uv -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制依赖文件
COPY pyproject.toml ./
# ==========================================
# 核心:自动删除可能存在的国外 lock
# 自动用国内源重新生成 lock
# --system 则是强制跳过虚拟环境,直接将包安装到操作系统全局的 Python 环境中
# ==========================================
RUN rm -f uv.lock && \
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
uv lock && \
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
uv pip install --system -e .
# 复制代码
COPY . .
# 启动服务
EXPOSE 8000
CMD ["uvicorn", "api.app:app", "--host", "0.0.0.0", "--port", "8000"]
命令解析:
uv sync:这就是用来下载依赖包
这是核心命令,意思是“根据 uv.lock 文件安装依赖”。
作用:它会读取 uv.lock,然后去下载并安装所有列出的第三方库。
--frozen:
含义:严格模式。
作用:它要求 pyproject.toml(项目定义)和 uv.lock(锁定版本)必须完全一
致。如果 uv.lock 不存在,或者它不是基于当前的 pyproject.toml 生成
的,uv 就会报错退出,不会自动去重新生成锁文件。
Docker 构建中,不希望构建过程“偷偷”修改了依赖版本。--frozen 确保了构建的可复现性。
--no-install-project:
含义:不安装当前项目本身。
依赖包被下载到哪里去了
当你执行uv sync时,uv默认会在当前工作目录(WORKDIR /app)下创建一个虚拟环境(.venv)
所有的第三方库(如 flask, requests 等)都会被解压并安装在这个 .venv/lib/python3.12/site-packages 目录下。
四、启动容器服务
1、写好docker-compose.yaml文件
services:
app:
# 直接使用你已经打包好的镜像
image: ppt_generation:v1.0 # 你的镜像名字
ports:
- "8000:8000"
depends_on:
- mysql
- postgres
restart: always
environment:
# 🔥 🔥 🔥 关键:强制覆盖代码里的 host
MYSQL_HOST: mysql
POSTGRESQL_HOST: postgres
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: user_login_info
volumes:
- mysql_data:/var/lib/mysql
postgres:
image: postgres:15
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: abc123456
POSTGRES_DB: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
mysql_data:
postgres_data:
2、启动容器
docker compose up -d
3、实时查看容器日志(排查错误最关键)
docker compose logs -f
4、排查错误所需要的docker命令
查看所有容器
docker ps -a
停止容器
docker stop <容器名称或ID>
删除容器
docker rm <容器名称或ID>
清除所有已经停止的容器
docker container prune