|
1 | 1 | # syntax=docker/dockerfile:1 |
| 2 | +FROM python:3.13-slim AS base |
| 3 | +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ |
2 | 4 |
|
3 | | -## Frontend |
4 | | -FROM node:21-slim AS frontend |
5 | | -ENV PNPM_HOME="/pnpm" |
6 | | -ENV PATH="$PNPM_HOME:$PATH" |
7 | | -RUN corepack enable |
| 5 | +ARG APP_VERSION=0.0.0.dev0 |
8 | 6 |
|
9 | 7 | WORKDIR /app |
10 | 8 |
|
11 | | -COPY --link ./package.json ./pnpm-lock.yaml ./tailwind.config.js ./ |
12 | | - |
13 | | -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile |
14 | | - |
15 | | -COPY ./src/zulip_write_only_proxy/frontend/templates/ \ |
16 | | - ./src/zulip_write_only_proxy/frontend/templates/ |
17 | | - |
18 | | -RUN pnpm build |
19 | | - |
20 | | -ADD --link https://unpkg.com/htmx.org@1.9.10/dist/htmx.js \ |
21 | | - https://unpkg.com/htmx.org@1.9.10/dist/htmx.min.js \ |
22 | | - ./src/zulip_write_only_proxy/frontend/static/ |
| 9 | +ENV \ |
| 10 | + PYTHONOPTIMIZE=2 \ |
| 11 | + SETUPTOOLS_SCM_PRETEND_VERSION=${APP_VERSION} \ |
| 12 | + UV_CACHE_DIR=/opt/uv-cache/ \ |
| 13 | + UV_COMPILE_BYTECODE=1 \ |
| 14 | + UV_LINK_MODE=copy |
23 | 15 |
|
| 16 | +RUN apt update && \ |
| 17 | + apt install -y wget --no-install-recommends && \ |
| 18 | + rm -rf /var/lib/apt/lists/* |
24 | 19 |
|
25 | | -## Server |
26 | | -FROM python:3.14-slim |
27 | | -COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ |
28 | 20 |
|
29 | | -WORKDIR /app |
| 21 | +FROM base AS dev |
30 | 22 |
|
31 | 23 | ENV \ |
32 | | - PYTHONOPTIMIZE=2 \ |
33 | | - UV_COMPILE_BYTECODE=1 \ |
34 | | - UV_LINK_MODE=copy \ |
35 | | - UV_CACHE_DIR=/opt/uv-cache/ |
| 24 | + PNPM_HOME="/pnpm" \ |
| 25 | + PATH="/pnpm:$PATH" |
36 | 26 |
|
37 | | -RUN apt update && apt install -y openssh-client wget git && rm -rf /var/lib/apt/lists/* |
| 27 | +RUN apt update && \ |
| 28 | + apt install -y node-corepack --no-install-recommends && \ |
| 29 | + corepack enable && \ |
| 30 | + rm -rf /var/lib/apt/lists/* |
38 | 31 |
|
39 | | -COPY --link ./pyproject.toml ./uv.lock /app/ |
| 32 | +COPY --link ./pyproject.toml ./uv.lock ./.python-version /app/ |
40 | 33 |
|
41 | 34 | RUN --mount=type=cache,target=/opt/uv-cache/ \ |
42 | | - uv sync --locked --no-install-project |
| 35 | + uv sync --frozen --no-install-workspace |
43 | 36 |
|
44 | 37 | COPY --link README.md ./ |
45 | | -COPY --link src ./src |
| 38 | +COPY --link packages ./packages |
| 39 | + |
| 40 | +RUN --mount=type=cache,id=pnpm,target=/pnpm/store cd packages/zwop \ |
| 41 | + pnpm install --frozen-lockfile |
46 | 42 |
|
47 | 43 | RUN --mount=type=cache,target=/opt/uv-cache/ \ |
48 | | - --mount=type=bind,source=.git,target=/app/.git \ |
49 | 44 | uv sync --locked |
50 | 45 |
|
51 | | -COPY --link --from=frontend /app/src/zulip_write_only_proxy/frontend \ |
52 | | - /app/src/zulip_write_only_proxy/frontend |
53 | 46 |
|
54 | | -EXPOSE 8000 |
| 47 | +FROM dev AS build |
| 48 | + |
| 49 | +RUN --mount=type=cache,target=/opt/uv-cache/ \ |
| 50 | + --mount=type=cache,id=pnpm,target=/pnpm/store \ |
| 51 | + uv build --all-packages |
| 52 | + |
| 53 | + |
| 54 | +FROM base AS zwop-tws |
| 55 | +RUN --mount=type=bind,from=build,source=/app/dist,target=/dist \ |
| 56 | + --mount=type=cache,target=/opt/uv-cache/ \ |
| 57 | + uv pip install --system /dist/zwop_tws-*.whl |
| 58 | + |
| 59 | +CMD ["zwop-tws"] |
| 60 | + |
| 61 | + |
| 62 | +FROM base AS zwop |
| 63 | +RUN --mount=type=bind,from=build,source=/app/dist,target=/dist \ |
| 64 | + --mount=type=cache,target=/opt/uv-cache/ \ |
| 65 | + uv pip install --system /dist/zwop-*.whl /dist/zwop_tws-*.whl |
55 | 66 |
|
56 | | -ENV ZWOP_ADDRESS=http://0.0.0.0:8000 |
| 67 | +CMD ["zwop"] |
57 | 68 |
|
58 | | -CMD ["uv", "run", "-m", "zulip_write_only_proxy.main"] |
59 | 69 |
|
60 | | -HEALTHCHECK --start-interval=1s --start-period=30s --interval=60s \ |
61 | | - CMD wget http://0.0.0.0:8000/api/health || exit 1 |
| 70 | +# Use dev as base so that default target is dev |
| 71 | +FROM dev |
0 commit comments