Keep source, config, and deploy files. Leave runtime data, uploads, and logs out of git. Co-authored-by: Cursor <cursoragent@cursor.com>
104 lines
3.0 KiB
Docker
104 lines
3.0 KiB
Docker
# Kamidso API. Build context is backend/ (Coolify base directory /backend,
|
|
# and the backend service in docker-compose.yml).
|
|
#
|
|
# Cache contract:
|
|
# 1. Base image and apt packages
|
|
# 2. requirements.txt -> pip install into /opt/venv
|
|
# 3. Application source
|
|
# A Python edit must leave the pip layer CACHED. A requirements.txt edit must not.
|
|
#
|
|
# The app is not installed as a distribution. `python -m kamidso.cli` imports
|
|
# the tree from /app, so source changes stay in the last COPY.
|
|
# requirements.txt is the install input (same file Liara uses).
|
|
# pyproject.toml is for local tooling and is not the image install input.
|
|
#
|
|
# Mirrors are build args. Empty values keep Debian and PyPI.
|
|
|
|
ARG PYTHON_IMAGE=python:3.12-slim-bookworm
|
|
|
|
FROM ${PYTHON_IMAGE} AS builder
|
|
|
|
# Build-only proxy. Do not copy these into an ENV; the running API must not
|
|
# use a global proxy. OpenRouter goes through OPENROUTER_PROXY_URL at runtime.
|
|
ARG HTTP_PROXY
|
|
ARG HTTPS_PROXY
|
|
ARG http_proxy
|
|
ARG https_proxy
|
|
ARG NO_PROXY
|
|
ARG no_proxy
|
|
|
|
ARG DEBIAN_MIRROR
|
|
ARG DEBIAN_SECURITY_MIRROR
|
|
|
|
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
|
PYTHONDONTWRITEBYTECODE=1
|
|
|
|
COPY docker/apt-mirror.py /tmp/apt-mirror.py
|
|
RUN python /tmp/apt-mirror.py \
|
|
&& apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
gcc \
|
|
g++ \
|
|
git \
|
|
pkg-config \
|
|
libffi-dev \
|
|
libssl-dev \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN python -m venv /opt/venv
|
|
ENV PATH="/opt/venv/bin:$PATH" \
|
|
VIRTUAL_ENV=/opt/venv
|
|
|
|
WORKDIR /build
|
|
COPY requirements.txt .
|
|
|
|
# Empty keeps https://pypi.org/simple. Set in Coolify for an Iran mirror.
|
|
# Defaults are empty strings so `set -u` does not fail when the arg is omitted.
|
|
ARG PIP_INDEX_URL=
|
|
ARG PIP_TRUSTED_HOST=
|
|
|
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
set -eu; \
|
|
index_args=""; \
|
|
if [ -n "${PIP_INDEX_URL}" ]; then index_args="--index-url ${PIP_INDEX_URL}"; fi; \
|
|
trust_args=""; \
|
|
if [ -n "${PIP_TRUSTED_HOST}" ]; then trust_args="--trusted-host ${PIP_TRUSTED_HOST}"; fi; \
|
|
python -m pip install --upgrade pip $index_args $trust_args \
|
|
&& python -m pip install $index_args $trust_args -r requirements.txt
|
|
|
|
FROM ${PYTHON_IMAGE}
|
|
|
|
ARG DEBIAN_MIRROR
|
|
ARG DEBIAN_SECURITY_MIRROR
|
|
|
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYTHONUTF8=1 \
|
|
PATH="/opt/venv/bin:$PATH" \
|
|
VIRTUAL_ENV=/opt/venv \
|
|
KAMIDSO_HOST=0.0.0.0 \
|
|
KAMIDSO_PORT=5670
|
|
|
|
COPY docker/apt-mirror.py /tmp/apt-mirror.py
|
|
RUN python /tmp/apt-mirror.py \
|
|
&& apt-get update && apt-get install -y --no-install-recommends \
|
|
curl \
|
|
git \
|
|
graphviz \
|
|
libgomp1 \
|
|
libgfortran5 \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& rm -f /tmp/apt-mirror.py
|
|
|
|
COPY --from=builder /opt/venv /opt/venv
|
|
|
|
WORKDIR /app
|
|
COPY . .
|
|
|
|
EXPOSE 5670
|
|
|
|
HEALTHCHECK --interval=20s --timeout=5s --start-period=180s --retries=10 \
|
|
CMD curl -fsS http://127.0.0.1:5670/health/live || exit 1
|
|
|
|
CMD ["python", "-m", "kamidso.cli", "serve", "--host", "0.0.0.0", "--port", "5670"]
|