|
1 | | -FROM python:{{cookiecutter.python_version}}-slim as builder |
| 1 | +# syntax=docker/dockerfile:1 |
| 2 | + |
| 3 | +FROM python:3.14-slim AS builder |
| 4 | +LABEL maintainer="André Felipe Dias <andref.dias@gmail.com>" |
| 5 | + |
| 6 | +RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ |
| 7 | + apt-get install -y --no-install-recommends build-essential libffi-dev libxml2-dev \ |
| 8 | + libxslt-dev curl libpq-dev && \ |
| 9 | + apt-get clean && \ |
| 10 | + rm -rf /var/lib/apt/lists/* |
| 11 | + |
| 12 | +# ref: https://github.com/astral-sh/uv-docker-example/blob/main/multistage.Dockerfile |
| 13 | + |
| 14 | +COPY --from=ghcr.io/astral-sh/uv:0.9.8 /uv /uvx /bin/ |
| 15 | + |
| 16 | +ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=0 |
| 17 | + |
| 18 | +WORKDIR /app |
| 19 | + |
| 20 | +COPY pyproject.toml uv.lock ./ |
| 21 | +RUN uv sync --locked --no-install-project --no-dev |
| 22 | + |
| 23 | +# --------------------------------------------------------- |
| 24 | + |
| 25 | +FROM python:3.14-slim AS final |
| 26 | + |
| 27 | +RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ |
| 28 | + apt-get install -y --no-install-recommends libpq-dev && \ |
| 29 | + apt-get clean && \ |
| 30 | + rm -rf /var/lib/apt/lists/* |
| 31 | + |
| 32 | +WORKDIR /app |
| 33 | +COPY --from=builder --chown=nobody:nogroup /app/.venv ./.venv |
| 34 | +ENV PATH=/app/.venv/bin:${PATH} |
| 35 | + |
| 36 | +COPY --chown=nobody:nogroup --exclude=pyproject.toml --exclude=uv.lock . ./ |
| 37 | + |
| 38 | +USER nobody |
| 39 | + |
| 40 | +EXPOSE 5000 |
| 41 | + |
| 42 | +CMD ["./entrypoint.sh"] |
| 43 | + |
| 44 | +# --------------------------------------------------------- |
| 45 | + |
| 46 | +FROM python:{{cookiecutter.python_version}}-slim AS builder |
2 | 47 | LABEL maintainer="{{cookiecutter.author}} <{{cookiecutter.email}}>" |
3 | 48 |
|
4 | 49 | RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ |
5 | | - apt-get install -y --no-install-recommends build-essential curl |
| 50 | + apt-get install -y --no-install-recommends build-essential libffi-dev libxml2-dev \ |
| 51 | + libxslt-dev curl && \ |
| 52 | + apt-get clean && \ |
| 53 | + rm -rf /var/lib/apt/lists/* |
6 | 54 |
|
7 | | -ENV PYTHONDONTWRITEBYTECODE=1 |
8 | | -ENV PYTHONUNBUFFERED=1 |
9 | | -RUN python -m venv /venv |
| 55 | +COPY --from=ghcr.io/astral-sh/uv:0.9.8 /uv /uvx /bin/ |
10 | 56 |
|
11 | | -ENV POETRY_VERSION=1.8.2 |
12 | | -ENV POETRY_HOME=/opt/poetry |
13 | | -SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
14 | | -RUN curl -sSL https://install.python-poetry.org | python - |
| 57 | +ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=0 |
15 | 58 |
|
16 | 59 | WORKDIR /app |
17 | | -COPY pyproject.toml poetry.lock ./ |
18 | | -RUN . /venv/bin/activate; \ |
19 | | - $POETRY_HOME/bin/poetry install --only main --no-interaction |
20 | 60 |
|
| 61 | +COPY pyproject.toml uv.lock ./ |
| 62 | +RUN uv sync --locked --no-install-project --no-dev |
21 | 63 |
|
22 | | -FROM python:{{cookiecutter.python_version}}-slim as final |
| 64 | +# --------------------------------------------------------- |
23 | 65 |
|
24 | | -COPY --from=builder /venv /venv |
25 | | -ENV PATH=/venv/bin:${PATH} |
| 66 | +FROM python:{{cookiecutter.python_version}}-slim AS final |
26 | 67 |
|
27 | 68 | WORKDIR /app |
| 69 | +COPY --from=builder --chown=nobody:nogroup /app/.venv ./.venv |
| 70 | +ENV PATH=/app/.venv/bin:${PATH} |
| 71 | + |
| 72 | +COPY --chown=nobody:nogroup --exclude=pyproject.toml --exclude=uv.lock . ./ |
| 73 | + |
28 | 74 | USER nobody |
29 | | -COPY --chown=nobody:nogroup {{cookiecutter.project_slug}}/ ./{{cookiecutter.project_slug}} |
| 75 | +EXPOSE 5000 |
30 | 76 |
|
31 | | -CMD ["hypercorn", "--worker-class={{cookiecutter.worker_class}}", "--bind=0.0.0.0:5000", "--error-logfile=-", "{{cookiecutter.project_slug}}.main:app"] |
| 77 | +CMD ["./entrypoint.sh"] |
0 commit comments