diff --git a/Dockerfile b/Dockerfile index ac2bb08..0aa6bf7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,41 @@ -FROM python:3.12-slim +FROM python:3.12-slim AS base ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ - UV_LINK_MODE=copy + UV_LINK_MODE=copy \ + PYTHONPATH=/app/src WORKDIR /app RUN pip install --no-cache-dir uv -COPY pyproject.toml ./ -RUN uv sync --no-install-project +COPY pyproject.toml uv.lock ./ + + +FROM base AS local_test + +RUN uv sync --all-groups --no-install-project COPY src ./src +COPY tests ./tests +COPY entrypoint.sh ./entrypoint.sh +RUN chmod +x ./entrypoint.sh EXPOSE 8000 -CMD ["uv", "run", "uvicorn", "comment_automation.main:app", "--app-dir", "src", "--host", "0.0.0.0", "--port", "8000"] +ENTRYPOINT ["./entrypoint.sh"] +CMD ["http"] + + +FROM base AS production + +RUN uv sync --no-dev --no-install-project + +COPY src ./src +COPY entrypoint.sh ./entrypoint.sh +RUN chmod +x ./entrypoint.sh + +EXPOSE 8000 + +ENTRYPOINT ["./entrypoint.sh"] +CMD ["http"] diff --git a/README.md b/README.md index fa5b30d..b3de715 100644 --- a/README.md +++ b/README.md @@ -56,3 +56,29 @@ uv run celery -A comment_automation.celery_app:celery_app worker --loglevel=info Without uv (venv already created): ./.venv/bin/celery -A comment_automation.celery_app:celery_app worker --loglevel=info + +## Docker targets and entrypoint modes + +The container uses entrypoint.sh and supports two main modes: + +- http: starts the FastAPI app. +- celery: starts the Celery worker. + +Build local/test target (installs all dependency groups): + +docker build --target local_test -t comment-automation:local . + +Build production target (installs only non-dev dependencies): + +docker build --target production -t comment-automation:prod . + +Run HTTP app (default mode): + +docker run --rm -p 8000:8000 comment-automation:prod + +Run Celery worker mode: + +docker run --rm \ + -e CELERY_BROKER_URL=redis://host.docker.internal:6379/0 \ + -e CELERY_RESULT_BACKEND=redis://host.docker.internal:6379/0 \ + comment-automation:prod celery diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..5c9f6dc --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env sh +set -eu + +mode="${1:-http}" + +case "$mode" in + http) + shift || true + exec uv run uvicorn comment_automation.main:app \ + --app-dir src \ + --host 0.0.0.0 \ + --port 8000 \ + "$@" + ;; + celery) + shift || true + exec uv run celery -A comment_automation.celery_app:celery_app worker \ + --loglevel "${CELERY_LOG_LEVEL:-info}" \ + "$@" + ;; + *) + exec "$@" + ;; +esac