advent22/Dockerfile
Jörn-Michael Miehe d0a7daf7be 🚧 api: re-scaffolding
- remove legacy "poetry.lock", "main.py"
- flesh out launch.json to use only "fastapi-cli"
- remove unneeded lines from "settings.json"
- rework main "Dockerfile" for "uv" compliance
- update ".dockerignore"
2026-02-19 03:10:03 +01:00

84 lines
1.8 KiB
Docker

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