| # An example using multi-stage image builds to create a final image without uv. | |
| # First, build the application in the `/app` directory. | |
| # See `Dockerfile` for details. | |
| FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim AS builder | |
| ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy | |
| # Disable Python downloads, because we want to use the system interpreter | |
| # across both images. If using a managed Python version, it needs to be | |
| # copied from the build image into the final image; see `standalone.Dockerfile` | |
| # for an example. | |
| ENV UV_PYTHON_DOWNLOADS=0 | |
| WORKDIR /app | |
| RUN --mount=type=cache,target=/root/.cache/uv \ | |
| --mount=type=bind,source=uv.lock,target=uv.lock \ | |
| --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ | |
| uv sync --frozen --no-install-project --no-dev | |
| ADD . /app | |
| RUN --mount=type=cache,target=/root/.cache/uv \ | |
| uv sync --frozen --no-dev | |
| # Then, use a final image without uv | |
| FROM python:3.13-slim-bookworm | |
| # It is important to use the image that matches the builder, as the path to the | |
| # Python executable must be the same, e.g., using `python:3.11-slim-bookworm` | |
| # will fail. | |
| WORKDIR /app | |
| RUN useradd -m -u 1000 app | |
| # Copy the application from the builder | |
| COPY --from=builder --chown=app:app /app /app | |
| # Place executables in the environment at the front of the path | |
| ENV PATH="/app/.venv/bin:$PATH" | |
| USER app | |
| CMD ["marimo", "run", "app.py", "--include-code", "--host", "0.0.0.0", "--port", "7860"] | |