grok2api / Dockerfile
传sir
1
f60d06e
Raw
History Blame Contribute Delete
2.36 kB
# Hugging Face Spaces Dockerfile for https://github.com/chenyme/grok2api
#
# Spaces routes traffic to port 7860 by default. The upstream project defaults
# to 8000, so this image overrides SERVER_PORT and starts Granian on 7860.
FROM python:3.13-slim AS builder
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_PROJECT_ENVIRONMENT=/opt/venv \
PATH="/opt/venv/bin:/root/.local/bin:$PATH"
WORKDIR /src
ARG GROK2API_REPO=https://github.com/chenyme/grok2api.git
ARG GROK2API_REF=main
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
curl \
git \
libffi-dev \
libssl-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
COPY --from=ghcr.io/astral-sh/uv:0.6 /uv /uvx /usr/local/bin/
RUN git clone --depth 1 --branch "${GROK2API_REF}" "${GROK2API_REPO}" . \
&& uv sync --frozen --no-dev --no-install-project \
&& find /opt/venv -type d \( -name "__pycache__" -o -name "tests" -o -name "test" -o -name "testing" \) -prune -exec rm -rf {} + \
&& find /opt/venv -type f -name "*.pyc" -delete \
&& rm -rf /root/.cache /tmp/uv-cache
FROM python:3.13-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
TZ=Asia/Shanghai \
VIRTUAL_ENV=/opt/venv \
PATH="/opt/venv/bin:$PATH" \
SERVER_HOST=0.0.0.0 \
SERVER_PORT=7860 \
SERVER_WORKERS=1 \
DATA_DIR=/app/data \
LOG_DIR=/app/logs
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
tzdata \
&& rm -rf /var/lib/apt/lists/* \
&& useradd -m -u 1000 user
WORKDIR /app
COPY --from=builder --chown=user:user /opt/venv /opt/venv
COPY --from=builder --chown=user:user /src /app
RUN mkdir -p /app/data /app/logs \
&& chmod +x /app/scripts/entrypoint.sh /app/scripts/init_storage.sh \
&& chown -R user:user /app
USER user
EXPOSE 7860
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD python -c "import os, urllib.request; urllib.request.urlopen(f'http://127.0.0.1:{os.environ.get(\"SERVER_PORT\", \"7860\")}/health', timeout=5).read()" || exit 1
ENTRYPOINT ["/app/scripts/entrypoint.sh"]
CMD ["sh", "-c", "exec granian --interface asgi --host ${SERVER_HOST} --port ${SERVER_PORT} --workers ${SERVER_WORKERS} app.main:app"]