@@ -6,31 +6,61 @@ RUN apt-get update && apt-get install -y \
66 libgobject-2.0-0 \
77 && rm -rf /var/lib/apt/lists/*
88
9+
10+ # ---- Builder image ----
911FROM base AS builder
1012
11- WORKDIR /builder
13+ ENV UV_COMPILE_BYTECODE=1 \
14+ UV_LINK_MODE=copy \
15+ UV_PYTHON_DOWNLOADS=0
16+
17+ # Install uv
18+ COPY --from=ghcr.io/astral-sh/uv:0.10.9 /uv /uvx /bin/
19+
20+ WORKDIR /app
21+
22+ # Install production dependencies without the project itself (cacheable layer)
23+ RUN --mount=type=cache,target=/root/.cache/uv \
24+ --mount=type=bind,source=uv.lock,target=uv.lock \
25+ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
26+ uv sync --locked --no-install-project --no-dev
1227
13- COPY pyproject.toml .
28+ # Install the project
29+ COPY . /app
30+ RUN --mount=type=cache,target=/root/.cache/uv \
31+ uv sync --locked --no-dev
1432
15- RUN mkdir /install && \
16- pip install --prefix=/install .
1733
34+ # ---- Development image ----
1835FROM base AS development
1936
37+ ENV UV_COMPILE_BYTECODE=1 \
38+ UV_LINK_MODE=copy \
39+ UV_PYTHON_DOWNLOADS=0
40+
41+ COPY --from=ghcr.io/astral-sh/uv:0.10.9 /uv /uvx /bin/
42+
2043WORKDIR /app
2144
22- COPY pyproject.toml .
23- RUN pip install --no-cache-dir ".[dev]"
45+ COPY . /app
46+
47+ RUN --mount=type=cache,target=/root/.cache/uv \
48+ uv sync --locked --all-extras
2449
25- COPY . .
50+ ENV PATH= "/app/.venv/bin:$PATH"
2651
2752CMD ["python" , "metadata_collector.py" , "dev" ]
2853
54+
55+ # ---- Production image ----
2956FROM base AS production
3057
3158WORKDIR /app
3259
33- COPY --from=builder /install /usr/local
60+ # Copy the pre-built virtualenv and application source
61+ COPY --from=builder /app /app
62+
63+ ENV PATH="/app/.venv/bin:$PATH"
3464
3565# Remove pip to reduce attack surface in production
3666RUN pip uninstall -y pip
@@ -39,6 +69,4 @@ RUN pip uninstall -y pip
3969ARG DOCKER_USER
4070USER ${DOCKER_USER}
4171
42- COPY ./*.py /app/
43-
4472CMD ["python" , "multi_user_transcriber.py" , "start" ]
0 commit comments