(三十)将程序构建为镜像
镜像保存解释器、依赖和程序;数据库、快照与模型版本由运行时卷保存。先看书目项目的 Dockerfile,每一步都对应前面已经执行过的安装或启动动作。
# 项目文件:catalog_project/Dockerfile
# 安装依赖与复制源码分层,实例数据由运行时卷保存。
FROM python:3.12-slim
WORKDIR /app
RUN python -m pip install --no-cache-dir uv==0.9.24
COPY pyproject.toml uv.lock ./
RUN uv sync --locked --no-dev --no-install-project
COPY src ./src
COPY tools ./tools
RUN uv sync --locked --no-dev --no-editable
RUN useradd --uid 10001 --create-home appuser && mkdir -p /app/instance && chown appuser:appuser /app/instance
ENV PATH="/app/.venv/bin:$PATH" PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1 CATALOG_DB=/app/instance/catalog.sqlite3 CATALOG_ARCHIVES=/app/instance/archives HEALTH_URL=http://127.0.0.1:8781/health/ready
USER 10001
EXPOSE 8781
HEALTHCHECK --interval=10s --timeout=3s --start-period=15s --retries=3 CMD ["python", "tools/healthcheck.py"]
CMD ["uvicorn", "cataloghub.web:create_app", "--factory", "--host", "0.0.0.0", "--port", "8781", "--workers", "2"]FROM 选择 Python 3.12 的基础环境,WORKDIR 设置后续工作目录。先复制项目声明和锁定文件,安装依赖,再复制源码;代码修改时,构建工具可以继续使用前面未变化的依赖层。第二次同步安装当前项目,采用普通安装方式,容器运行不依赖源码的可编辑链接。
USER 10001 使服务以应用用户运行,实例目录预先交给它写入。PATH 将容器虚拟环境的命令放在前面;CMD 是默认启动命令。EXPOSE 说明容器服务端口,真正把端口接到宿主机还要看 Compose 的 ports。
# 项目文件:catalog_project/.dockerignore
# 环境和运行数据留在宿主机或卷里。
.venv
instance
models
__pycache__
*.egg-info
build
dist
.git
.env
.pytest_cache
.dockerignore 防止将宿主机虚拟环境、数据库与构建残留复制进上下文。模型项目的 Dockerfile 采用同样顺序,并复制训练 CSV,将模型根目录设为 /models,限制每个进程的 CPU 计算线程数。
逐层安装 uv 项目的写法可对照 uv 的 Docker 集成文档。镜像中直接使用 Uvicorn 启动工作进程,相关部署过程见 FastAPI 容器部署文档。