pyvideotrans Docker & Self-Hosted Deployment

GitHub

Translate the video from one language to another and embed dubbing & subtitles.

1. Pull Image (DOCKERHUB) docker pull jianchang512/pyvideotrans:latest
2. Docker Run (1-Click Launch) docker run -d --name pyvideotrans -p 7860:7860 --restart always jianchang512/pyvideotrans:latest
3. Podman Run podman run -d --name pyvideotrans -p 7860:7860 --restart always jianchang512/pyvideotrans:latest
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://docker.io/jianchang512/pyvideotrans:latest
5. ORAS Pull (OCI Artifact) oras pull jianchang512/pyvideotrans:latest
Dockerfile
# ============================================================
# pyVideoTrans WebUI Dockerfile
#
# CPU:  docker build -t pyvideotrans-webui .
# GPU:  docker build --build-arg USE_CUDA=true -t pyvideotrans-webui:gpu .
# ============================================================

# 定义全局 ARG 变量
ARG USE_CUDA=false

# 巧妙地将阶段命名为 base-false 和 base-true
FROM python:3.10-slim AS base-false
FROM nvidia/cuda:12.8.0-cudnn-runtime-ubuntu22.04 AS base-true

# 根据 USE_CUDA 变量的值,动态继承上文对应的基础镜像
FROM base-${USE_CUDA} AS final-base

# 【关键】在新的 FROM 阶段之后,必须重新声明一次 ARG 才能在 RUN 等指令中使用该变量
ARG USE_CUDA

COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

ENV GRADIO_SERVER_NAME="0.0.0.0"
ENV GRADIO_SERVER_PORT=7860
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
ENV FONTCONFIG_PATH=/etc/fonts

WORKDIR /app

RUN apt-get update && apt-get install -y --no-install-recommends \
    fontconfig fonts-noto-cjk fonts-liberation fonts-dejavu wget \
    xz-utils git libglib2.0-0 libgl1 libsm6 libxext6 libxrender-dev \
    libxkbcommon-x11-0 libdbus-1-3 libsndfile1 python3-dev rubberband-cli libsndfile1-dev \
    && wget -q https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz \
    && tar -Jxf ffmpeg-release-amd64-static.tar.xz \
    && cp ffmpeg-*-static/ffmpeg /usr/local/bin/ \
    && cp ffmpeg-*-static/ffprobe /usr/local/bin/ \
    && rm -rf ffmpeg-* \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Copy dependency specification files first for Docker layer caching
COPY pyproject.toml uv.lock .python-version* ./

# 修复丢失了变量的 if 语句,正确引用 "${USE_CUDA}"
RUN if [ "${USE_CUDA}" = "true" ]; then \
        echo ">>> CUDA" && \
        uv pip install --system -r pyproject.toml --all-extras && \
        uv pip install --system torch==2.7.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu128 && \
        uv pip install --system nvidia-cublas-cu12 nvidia-cudnn-cu12; \
    else \
        echo ">>> CPU" && \
        # Pre-install CPU PyTorch so that 'uv pip install -r pyproject.toml' sees torch as satisfied and does not download NVIDIA CUDA wheels \
        uv pip install --system torch==2.7.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cpu && \
        uv pip install --system -r pyproject.toml --all-extras; \
    fi && \
    rm -rf /root/.cache/uv /tmp/*

# Copy application source code
COPY . .

EXPOSE 7860

CMD ["python", "webui.py"]