前言
uv与Docker的集成
镜像的选择
可以选择uv自己提供的镜像。
ghcr.io/astral-sh/uv:latestghcr.io/astral-sh/uv:alpine
(建议)但是考虑Python的版本比较多,建议基于Python镜像进行构建:
FROM python:3.12-slim-bookworm
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
使用uv管理项目
# Copy the project into the image
ADD . /app
# Sync the project into a new environment, using the frozen lockfile
WORKDIR /app
RUN uv sync --frozen
最佳实践是在您的仓库中向
.venv文件添加.dockerignore以防止其包含在镜像构建中。项目虚拟环境依赖于您的本地平台,应在镜像中从头创建。或者项目内添加
.dockerignore。
启动程序
# 最基本的启动
# Presuming there is a `my_app` command provided by the project
CMD ["uv", "run", "my_app"]
# 使用gradio的启动,包含暴露端口
EXPOSE 7860
# Run the project
CMD ["uv", "run", "--", "gradio", "./main.py"]
一个完整的DOCKERFILE文件
FROM python:3.12-slim-bookworm
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
# Copy the project into the image
ADD . /app
# Sync the project into a new environment, using the frozen lockfile
WORKDIR /app
RUN uv sync --frozen
# 最基本的启动
# Presuming there is a `my_app` command provided by the project
CMD ["uv", "run", "my_app"]
docker-compose.yaml
services:
web:
build:
context: .
ports:
- "7860:7860"
env_file:
- path: ./.env
develop:
# Create a `watch` configuration to update the app
#
watch:
# Sync the working directory with the `/app` directory in the container
- action: sync
path: .
target: /app
# Exclude the project virtual environment
ignore:
- .venv/
- .gradio/
# environment:
# - API_SECRET_KEY = "xxxxx"
# - BASE_URL = "xxxxx"
# - LANGCHAIN_TRACING_V2="true"
# - LANGCHAIN_API_KEY="xxxx"