Python包管理器uv与Docker的集成

994 阅读1分钟

前言

uv(Python 包和项目管理器)的基本命令及镜像设置

uv与Docker的集成

镜像的选择

可以选择uv自己提供的镜像。

  • ghcr.io/astral-sh/uv:latest
  • ghcr.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"

参考