ARG NODE_VERSION=24 ARG PYTHON_VERSION=3.14-slim ############ # build ui # ############ ARG NODE_VERSION FROM node:${NODE_VERSION} AS build-ui # env setup WORKDIR /usr/local/src/advent22_ui # install advent22_ui dependencies COPY ui/package*.json ui/yarn*.lock ./ RUN set -ex; \ corepack enable; \ yarn install; # copy and build advent22_ui COPY ui ./ RUN set -ex; \ yarn dlx update-browserslist-db@latest; \ yarn build --dest /tmp/advent22_ui/html; \ # exclude webpack-bundle-analyzer output rm -f /tmp/advent22_ui/html/report.html; ########### # web app # ########### ARG PYTHON_VERSION FROM python:${PYTHON_VERSION} AS production # env setup ENV \ PATH="/usr/local/share/advent22_api/.venv/bin:$PATH" \ UV_COMPILE_BYTECODE=1 \ UV_NO_DEV=1 \ PRODUCTION_MODE="true" EXPOSE 8000 # install advent22_api deps WORKDIR /usr/local/share/advent22_api RUN --mount=from=ghcr.io/astral-sh/uv,source=/uv,target=/bin/uv \ --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=api/uv.lock,target=uv.lock \ --mount=type=bind,source=api/pyproject.toml,target=pyproject.toml \ \ uv sync \ --locked \ --no-install-project \ --no-editable \ ; # install advent22_api COPY api ./ RUN --mount=from=ghcr.io/astral-sh/uv,source=/uv,target=/bin/uv \ --mount=type=cache,target=/root/.cache/uv \ \ uv sync \ --locked \ --no-editable \ ; CMD [ \ "fastapi", "run", \ "--host", "0.0.0.0", \ "--port", "8000", \ "--entrypoint", "advent22_api.app:app", \ "--workers", "$(nproc)" \ ] # add prepared advent22_ui COPY --from=build-ui /tmp/advent22_ui /usr/local/share/advent22_ui # prepare data directory WORKDIR /opt/advent22 VOLUME [ "/opt/advent22" ] RUN chown -R nobody:nogroup ./ # run as unprivileged user USER nobody