FROM python:3.14-slim COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv # Node.js 22 LTS RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl tini xvfb \ && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Python deps — cached until pyproject.toml / uv.lock change COPY pyproject.toml uv.lock ./ # TypeScript deps — cached until package*.json changes COPY room_cal/service_api/typescript/package*.json \ ./room_cal/service_api/typescript/ RUN cd room_cal/service_api/typescript \ && npm ci \ && node_modules/.bin/playwright install-deps chromium # Vue/Vite deps — cached until package*.json changes COPY room_cal/vue/package*.json ./room_cal/vue/ RUN cd room_cal/vue && npm ci # Entrypoint & stdout logging COPY docker/entrypoint.sh /entrypoint.sh COPY docker/uvicorn_log.json /etc/uvicorn_log.json RUN chmod +x /entrypoint.sh # App source + install project COPY room_cal/ ./room_cal/ RUN mkdir /root/.local && ln -s /config /root/.local/room_cal \ && cd room_cal/vue && npm run build \ && uv sync --group api --no-dev --frozen # Exec ENTRYPOINT ["/usr/bin/tini", "--"] CMD ["/entrypoint.sh"]