|
1 |
| -ARG PYTHON_BUILDER_IMAGE=3.11-slim-bookworm |
2 | 1 |
|
| 2 | +ARG BUILDER_IMAGE=python:3.12-slim-bookworm |
3 | 3 | ## ---------------------------------------------------------------------------------- ##
|
4 | 4 | ## ------------------------- Python base -------------------------------------------- ##
|
5 | 5 | ## ---------------------------------------------------------------------------------- ##
|
6 |
| -FROM python:${PYTHON_BUILDER_IMAGE} as python-base |
7 |
| -ENV PIP_DEFAULT_TIMEOUT=100 \ |
8 |
| - PIP_DISABLE_PIP_VERSION_CHECK=1 \ |
9 |
| - PIP_NO_CACHE_DIR=1 \ |
10 |
| - PIP_ROOT_USER_ACTION=ignore \ |
11 |
| - PYTHONDONTWRITEBYTECODE=1 \ |
12 |
| - PYTHONUNBUFFERED=1 \ |
13 |
| - PYTHONFAULTHANDLER=1 \ |
14 |
| - PYTHONHASHSEED=random \ |
15 |
| - LANG=C.UTF-8 \ |
16 |
| - LC_ALL=C.UTF-8 |
| 6 | +FROM ${BUILDER_IMAGE} AS python-base |
17 | 7 | RUN apt-get update \
|
18 | 8 | && apt-get upgrade -y \
|
19 |
| - && apt-get install -y --no-install-recommends git tini \ |
| 9 | + && apt-get install -y --no-install-recommends tini \ |
20 | 10 | && apt-get autoremove -y \
|
21 | 11 | && apt-get clean -y \
|
22 | 12 | && rm -rf /root/.cache \
|
23 | 13 | && rm -rf /var/apt/lists/* \
|
24 | 14 | && rm -rf /var/cache/apt/* \
|
25 |
| - && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false\ |
26 |
| - && mkdir -p /workspace/app \ |
27 |
| - && pip install --quiet -U pip wheel setuptools virtualenv |
28 |
| - |
| 15 | + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ |
| 16 | + && mkdir -p /workspace/app |
| 17 | +# Install uv |
| 18 | +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ |
29 | 19 | ## ---------------------------------------------------------------------------------- ##
|
30 | 20 | ## ------------------------- Python build base -------------------------------------- ##
|
31 | 21 | ## ---------------------------------------------------------------------------------- ##
|
32 |
| -FROM python-base AS build-base |
33 |
| -ARG UV_INSTALL_ARGS="" |
34 |
| -ENV UV_INSTALL_ARGS="${UV_INSTALL_ARGS}" \ |
35 |
| - GRPC_PYTHON_BUILD_WITH_CYTHON=1 \ |
36 |
| - PATH="/workspace/app/.venv/bin:/usr/local/bin:$PATH" |
| 22 | +FROM python-base AS builder |
| 23 | +ARG UV_INSTALL_ARGS="--no-dev" |
| 24 | +ENV GRPC_PYTHON_BUILD_WITH_CYTHON=1 \ |
| 25 | + UV_LINK_MODE=copy \ |
| 26 | + UV_NO_CACHE=1 \ |
| 27 | + UV_COMPILE_BYTECODE=1 \ |
| 28 | + UV_INSTALL_ARGS="${UV_INSTALL_ARGS}" \ |
| 29 | + UV_SYSTEM_PYTHON=1 \ |
| 30 | + PATH="/workspace/app/.venv/bin:/usr/local/bin:/opt/nodeenv/bin:$PATH" \ |
| 31 | + PYTHONDONTWRITEBYTECODE=1 \ |
| 32 | + PYTHONUNBUFFERED=1 \ |
| 33 | + PYTHONFAULTHANDLER=1 \ |
| 34 | + PYTHONHASHSEED=random \ |
| 35 | + LANG=C.UTF-8 \ |
| 36 | + LC_ALL=C.UTF-8 |
37 | 37 | ## -------------------------- add build packages ----------------------------------- ##
|
38 |
| -RUN apt-get install -y --no-install-recommends build-essential curl \ |
| 38 | +RUN apt-get install -y --no-install-recommends git build-essential curl \ |
39 | 39 | && apt-get autoremove -y \
|
40 |
| - && apt-get clean make -y \ |
| 40 | + && apt-get clean -y \ |
41 | 41 | && rm -rf /root/.cache \
|
42 | 42 | && rm -rf /var/apt/lists/* \
|
43 | 43 | && rm -rf /var/cache/apt/* \
|
44 |
| - && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false |
| 44 | + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ |
| 45 | + && mkdir -p /cloudsql |
| 46 | + |
45 | 47 |
|
46 | 48 | ## -------------------------- install application ----------------------------------- ##
|
47 | 49 | WORKDIR /workspace/app
|
48 | 50 | COPY pyproject.toml uv.lock README.md .pre-commit-config.yaml LICENSE Makefile \
|
49 |
| - package.json package-lock.json vite.config.ts tsconfig.json tsconfig.node.json \ |
| 51 | + package.json package-lock.json vite.config.ts tsconfig.json \ |
50 | 52 | tailwind.config.cjs postcss.config.cjs components.json \
|
51 | 53 | ./
|
52 | 54 | COPY tools ./tools/
|
| 55 | +RUN uvx nodeenv --quiet /opt/nodeenv/ |
| 56 | +RUN NODE_OPTIONS="--no-deprecation --disable-warning=ExperimentalWarning" npm install --ignore-scripts --no-fund |
| 57 | +RUN uv venv \ |
| 58 | + && uv sync ${UV_INSTALL_ARGS} --frozen --no-install-project --no-editable \ |
| 59 | + && uv export ${UV_INSTALL_ARGS} --frozen --no-hashes --output-file=requirements.txt |
| 60 | + |
53 | 61 | COPY public ./public/
|
54 | 62 | COPY resources ./resources/
|
55 |
| -RUN python -m venv --copies /workspace/app/.venv \ |
56 |
| - && /workspace/app/.venv/bin/pip install --quiet uv nodeenv cython \ |
57 |
| - && make install ${UV_INSTALL_ARGS} \ |
58 |
| - && uv export ${UV_INSTALL_ARGS} --no-hashes --no-dev --output-file=requirements.txt |
| 63 | +RUN uv run pip install --quiet cython \ |
| 64 | + && uv sync ${UV_INSTALL_ARGS} --frozen --no-install-project --no-editable \ |
| 65 | + && uv export ${UV_INSTALL_ARGS} --frozen --no-hashes --output-file=requirements.txt |
59 | 66 | COPY src ./src/
|
60 |
| -RUN make build |
| 67 | + |
| 68 | +# build the frontend and sync the project |
| 69 | +RUN uv run tools/manage-assets.py --build-assets \ |
| 70 | + && uv sync ${UV_INSTALL_ARGS} --frozen --no-editable \ |
| 71 | + && uv build |
61 | 72 |
|
62 | 73 |
|
63 | 74 | ## ---------------------------------------------------------------------------------- ##
|
64 |
| -## -------------------------------- runtime build ----------------------------------- ## |
| 75 | +## -------------------------------- Run Image ----------------------------------- ## |
65 | 76 | ## ---------------------------------------------------------------------------------- ##
|
66 | 77 | ## ------------------------- use base image ---------------------------------------- ##
|
67 | 78 |
|
68 |
| -FROM python-base as run-image |
| 79 | +FROM python-base AS runner |
69 | 80 | ARG ENV_SECRETS="runtime-secrets"
|
| 81 | +ARG VITE_USE_SERVER_LIFESPAN="false" |
| 82 | +ARG SAQ_USE_SERVER_LIFESPAN="false" |
70 | 83 | ARG LITESTAR_APP="app.asgi:create_app"
|
71 | 84 | ENV ENV_SECRETS="${ENV_SECRETS}" \
|
| 85 | + PATH="/workspace/app/.venv/bin:/usr/local/bin:$PATH" \ |
| 86 | + UV_LINK_MODE=copy \ |
| 87 | + UV_NO_CACHE=1 \ |
| 88 | + UV_COMPILE_BYTECODE=1 \ |
| 89 | + UV_SYSTEM_PYTHON=1 \ |
| 90 | + UV_INSTALL_ARGS="${UV_INSTALL_ARGS}" \ |
| 91 | + VITE_USE_SERVER_LIFESPAN="${VITE_USE_SERVER_LIFESPAN}" \ |
| 92 | + SAQ_USE_SERVER_LIFESPAN="${SAQ_USE_SERVER_LIFESPAN}" \ |
| 93 | + PYTHONDONTWRITEBYTECODE=1 \ |
| 94 | + PYTHONUNBUFFERED=1 \ |
| 95 | + PYTHONFAULTHANDLER=1 \ |
| 96 | + PYTHONHASHSEED=random \ |
| 97 | + LANG=C.UTF-8 \ |
| 98 | + LC_ALL=C.UTF-8 \ |
72 | 99 | LITESTAR_APP="${LITESTAR_APP}"
|
73 |
| - |
| 100 | +## -------------------------- install built application -------------------------------- ## |
74 | 101 | RUN addgroup --system --gid 65532 nonroot \
|
75 | 102 | && adduser --no-create-home --system --uid 65532 nonroot \
|
76 | 103 | && chown -R nonroot:nonroot /workspace
|
77 |
| -## -------------------------- install application ----------------------------------- ## |
78 |
| -COPY --from=build-base --chown=65532:65532 /workspace/app/requirements.txt /tmp/requirements.txt |
79 |
| -COPY --from=build-base --chown=65532:65532 /workspace/app/dist /tmp/ |
| 104 | +COPY --from=builder --chown=65532:65532 /cloudsql /cloudsql |
| 105 | +COPY --from=builder --chown=65532:65532 /workspace/app/dist /tmp/ |
80 | 106 | WORKDIR /workspace/app
|
81 |
| -RUN pip install --quiet --disable-pip-version-check --no-deps --requirement=/tmp/requirements.txt |
82 |
| -RUN pip install --quiet --disable-pip-version-check --no-deps /tmp/*.whl |
83 |
| - |
| 107 | +RUN uv pip ${UV_INSTALL_ARGS} install --quiet --disable-pip-version-check /tmp/*.whl \ |
| 108 | + && rm -Rf /tmp/* \ |
| 109 | + && chown -R nonroot:nonroot /workspace/app |
84 | 110 | USER nonroot
|
85 | 111 | STOPSIGNAL SIGINT
|
86 |
| -EXPOSE 8000 |
| 112 | +EXPOSE 8080 |
87 | 113 | ENTRYPOINT ["tini","--" ]
|
88 |
| -CMD [ "litestar","run","--host","0.0.0.0"] |
| 114 | +CMD [ "app", "run", "--port","8080", "--host", "0.0.0.0"] |
89 | 115 | VOLUME /workspace/app
|
0 commit comments