# building frontend FROM node:24-slim AS frontend WORKDIR /app/frontend COPY web/package.json web/yarn.lock ./ RUN yarn install --frozen-lockfile # fix docker not following symlinks COPY web ./ COPY doc/getting-started.md ./src/assets/ ARG DOCAT_VERSION=unknown ENV VITE_DOCAT_VERSION=$DOCAT_VERSION RUN yarn build # setup Python FROM python:3.14-slim AS backend # configure docker container ENV PYTHONDONTWRITEBYTECODE=1 COPY --from=ghcr.io/astral-sh/uv:0.10.4 /uv /uvx /bin/ COPY /docat/pyproject.toml /docat/uv.lock /app/ # Install the application WORKDIR /app/docat RUN uv sync --no-install-project --no-dev --color never # production FROM python:3.14-slim # defaults ENV MAX_UPLOAD_SIZE=100M # set up the system RUN apt-get update && \ apt-get install --yes nginx dumb-init libmagic1 gettext && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /var/docat/doc # install the application RUN mkdir -p /var/www/html COPY --from=frontend /app/frontend/dist /var/www/html COPY docat /app/docat WORKDIR /app/docat # Copy the build artifact (.venv) COPY --from=backend /app /app/docat ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["sh", "-c", "envsubst '$MAX_UPLOAD_SIZE' < /app/docat/docat/nginx/default > /etc/nginx/sites-enabled/default && nginx && .venv/bin/python -m uvicorn --host 0.0.0.0 --port 5000 docat.app:app"]