| |
| |
| |
| FROM nvidia/cuda:12.1.1-devel-ubuntu22.04 |
|
|
| ENV DEBIAN_FRONTEND=noninteractive \ |
| PIP_DISABLE_PIP_VERSION_CHECK=1 \ |
| PIP_NO_CACHE_DIR=1 \ |
| HOME=/home/user \ |
| PYTHONUNBUFFERED=1 |
|
|
| |
| RUN apt-get update && apt-get install -y --no-install-recommends \ |
| python3.10 python3.10-dev python3-pip python-is-python3 \ |
| python3.10-venv python3-venv \ |
| git curl ffmpeg libsm6 libxext6 bash \ |
| && rm -rf /var/lib/apt/lists/* |
|
|
| |
| RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 |
|
|
| |
| RUN useradd -m -u 1000 user && \ |
| mkdir -p /home/user && chown -R user:user /home/user |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| RUN printf '%s\n' \ |
| '#!/usr/bin/env bash' \ |
| 'set -euo pipefail' \ |
| 'export GIT_TERMINAL_PROMPT=0' \ |
| '' \ |
| 'PY=python3.10' \ |
| 'TARGET_ROOT="${TARGET_ROOT:-/home/user/app}"' \ |
| 'VENV_DIR="${VENV_DIR:-/home/user/venv}"' \ |
| 'REPO="${GIT_REPO:-}"' \ |
| 'REF="${GIT_REF:-main}"' \ |
| 'SUBDIR="${GIT_SUBDIR:-}"' \ |
| '' \ |
| 'if [[ -z "${REPO}" || -z "${GIT_TOKEN:-}" ]]; then' \ |
| ' echo "[error] GIT_REPO and GIT_TOKEN must be set." >&2; exit 1' \ |
| 'fi' \ |
| '' \ |
| '# Normalize to full HTTPS URL' \ |
| 'if [[ "${REPO}" == *"://"* ]]; then BASE_URL="${REPO}"; else BASE_URL="https://github.com/${REPO}.git"; fi' \ |
| '' \ |
| '# For GitHub: embed token to avoid prompts; for other hosts use header' \ |
| 'USE_HEADER=0' \ |
| 'if [[ "${BASE_URL}" == https://github.com/* ]]; then' \ |
| ' AUTH_URL="${BASE_URL/https:\/\//https:\/\/x-access-token:${GIT_TOKEN}@}"' \ |
| 'else' \ |
| ' AUTH_URL="${BASE_URL}"; USE_HEADER=1' \ |
| 'fi' \ |
| '' \ |
| 'echo "[info] Cloning ${BASE_URL}@${REF} into ${TARGET_ROOT}..."' \ |
| 'rm -rf "${TARGET_ROOT}" "${VENV_DIR}"' \ |
| 'mkdir -p "${TARGET_ROOT}"' \ |
| 'if [[ "${USE_HEADER}" -eq 1 ]]; then' \ |
| ' git -c http.extraHeader="Authorization: Bearer ${GIT_TOKEN}" clone --depth 1 --branch "${REF}" "${AUTH_URL}" "${TARGET_ROOT}"' \ |
| 'else' \ |
| ' git clone --depth 1 --branch "${REF}" "${AUTH_URL}" "${TARGET_ROOT}"' \ |
| 'fi' \ |
| '' \ |
| 'if [[ -n "${SUBDIR}" && -d "${TARGET_ROOT}/${SUBDIR}" ]]; then' \ |
| ' cd "${TARGET_ROOT}/${SUBDIR}"' \ |
| 'else' \ |
| ' cd "${TARGET_ROOT}"' \ |
| 'fi' \ |
| '' \ |
| 'echo "[info] Creating venv at ${VENV_DIR}..."' \ |
| '"${PY}" -m venv "${VENV_DIR}"' \ |
| 'source "${VENV_DIR}/bin/activate"' \ |
| 'python -m pip install --upgrade pip setuptools wheel' \ |
| '' \ |
| '# If requirements exist, install them (with CUDA 12.1 index if torch listed)' \ |
| 'if [[ -f requirements.txt ]]; then' \ |
| ' if grep -qiE "^(torch|torchvision|torchaudio)" requirements.txt; then' \ |
| ' echo "[info] Installing with PyTorch cu121 index..."' \ |
| ' pip install --extra-index-url https://download.pytorch.org/whl/cu121 -r requirements.txt' \ |
| ' else' \ |
| ' pip install -r requirements.txt' \ |
| ' fi' \ |
| 'fi' \ |
| '' \ |
| 'APP_ENTRY="app.py"; [[ -f "gradio_app.py" ]] && APP_ENTRY="gradio_app.py"' \ |
| 'if [[ ! -f "${APP_ENTRY}" ]]; then echo "[error] No app.py or gradio_app.py found." >&2; ls -la; exit 1; fi' \ |
| '' \ |
| 'echo "[info] Starting ${APP_ENTRY}..."' \ |
| 'exec "${VENV_DIR}/bin/python" "${APP_ENTRY}"' \ |
| > /usr/local/bin/start.sh && chmod 755 /usr/local/bin/start.sh |
|
|
| |
| USER user |
| ENV PATH="/home/user/.local/bin:${PATH}" \ |
| GRADIO_SERVER_NAME=0.0.0.0 \ |
| PORT=7860 |
| WORKDIR /home/user |
|
|
| EXPOSE 7860 |
| CMD ["/usr/local/bin/start.sh"] |
|
|