89 lines
2.5 KiB
Docker
89 lines
2.5 KiB
Docker
# syntax=docker/dockerfile:1.7
|
||
|
||
# ---- builder ----
|
||
FROM python:3.12-slim AS builder
|
||
|
||
ENV PYTHONUNBUFFERED=1 \
|
||
PYTHONDONTWRITEBYTECODE=1 \
|
||
UV_COMPILE_BYTECODE=1 \
|
||
UV_LINK_MODE=copy
|
||
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
build-essential \
|
||
libpq-dev \
|
||
libgdal-dev \
|
||
libproj-dev \
|
||
libgeos-dev \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
RUN pip install --no-cache-dir uv
|
||
|
||
WORKDIR /app
|
||
|
||
COPY pyproject.toml uv.lock* ./
|
||
RUN if [ -f uv.lock ]; then uv sync --frozen --no-dev; else uv sync --no-dev; fi
|
||
|
||
COPY app ./app
|
||
COPY alembic.ini ./
|
||
COPY alembic ./alembic
|
||
|
||
|
||
# ---- runner ----
|
||
FROM python:3.12-slim AS runner
|
||
|
||
ENV PYTHONUNBUFFERED=1 \
|
||
PYTHONDONTWRITEBYTECODE=1 \
|
||
PATH="/app/.venv/bin:$PATH"
|
||
|
||
# Runtime libs only — no -dev / no build-essential.
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
libpq5 \
|
||
libgdal36 \
|
||
libproj25 \
|
||
libgeos-c1t64 \
|
||
libcairo2 \
|
||
libpango-1.0-0 \
|
||
libpangoft2-1.0-0 \
|
||
fonts-dejavu-core \
|
||
curl \
|
||
# Chromium runtime libs for Playwright (отдельно вместо --with-deps, чтобы apt-lists
|
||
# были доступны до самой команды playwright install).
|
||
libnss3 \
|
||
libnspr4 \
|
||
libdbus-1-3 \
|
||
libatk1.0-0 \
|
||
libatk-bridge2.0-0 \
|
||
libcups2 \
|
||
libdrm2 \
|
||
libxkbcommon0 \
|
||
libxcomposite1 \
|
||
libxdamage1 \
|
||
libxfixes3 \
|
||
libxrandr2 \
|
||
libgbm1 \
|
||
libasound2t64 \
|
||
libatspi2.0-0 \
|
||
&& useradd --create-home --uid 1000 app
|
||
|
||
WORKDIR /app
|
||
|
||
COPY --from=builder --chown=app:app /app/.venv /app/.venv
|
||
COPY --from=builder --chown=app:app /app/app /app/app
|
||
COPY --from=builder --chown=app:app /app/alembic.ini /app/alembic.ini
|
||
COPY --from=builder --chown=app:app /app/alembic /app/alembic
|
||
|
||
# Playwright Chromium binary (~150 MB) — устанавливаем под root, кладём в общую
|
||
# директорию, чтобы и app-user мог использовать. Без --with-deps: системные
|
||
# библиотеки уже поставлены apt-get выше, а --with-deps требует apt-lists
|
||
# которые мы тут же чистим в одной команде ради размера слоя.
|
||
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright
|
||
RUN mkdir -p $PLAYWRIGHT_BROWSERS_PATH \
|
||
&& /app/.venv/bin/playwright install chromium \
|
||
&& chmod -R a+rX $PLAYWRIGHT_BROWSERS_PATH \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
USER app
|
||
|
||
EXPOSE 8000
|
||
|
||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|