Spaces:
Running
Running
# syntax=docker/dockerfile:1 | |
# Keep this syntax directive! It's used to enable Docker BuildKit | |
################################ | |
# BUILDER-BASE | |
# Used to build deps + create our virtual environment | |
################################ | |
# 1. use python:3.12.3-slim as the base image until https://github.com/pydantic/pydantic-core/issues/1292 gets resolved | |
# 2. do not add --platform=$BUILDPLATFORM because the pydantic binaries must be resolved for the final architecture | |
# Use a Python image with uv pre-installed | |
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder | |
# Install the project into `/app` | |
WORKDIR /app | |
# Enable bytecode compilation | |
ENV UV_COMPILE_BYTECODE=1 | |
# Copy from the cache instead of linking since it's a mounted volume | |
ENV UV_LINK_MODE=copy | |
RUN apt-get update \ | |
&& apt-get install --no-install-recommends -y \ | |
# deps for building python deps | |
build-essential \ | |
git \ | |
# npm | |
npm \ | |
# gcc | |
gcc \ | |
&& apt-get clean \ | |
&& rm -rf /var/lib/apt/lists/* | |
# Install the project's dependencies using the lockfile and settings | |
# We need to mount the root uv.lock and pyproject.toml to build the base with uv because we're still using uv workspaces | |
RUN --mount=type=cache,target=/root/.cache/uv \ | |
--mount=type=bind,source=src/backend/base/README.md,target=src/backend/base/README.md \ | |
--mount=type=bind,source=src/backend/base/uv.lock,target=src/backend/base/uv.lock \ | |
--mount=type=bind,source=src/backend/base/pyproject.toml,target=src/backend/base/pyproject.toml \ | |
--mount=type=bind,source=uv.lock,target=uv.lock \ | |
--mount=type=bind,source=README.md,target=README.md \ | |
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \ | |
cd src/backend/base && uv sync --frozen --no-install-project --no-dev --no-editable | |
ADD ./src /app/src | |
COPY src/frontend /tmp/src/frontend | |
WORKDIR /tmp/src/frontend | |
RUN npm install \ | |
&& npm run build \ | |
&& cp -r build /app/src/backend/base/langflow/frontend \ | |
&& rm -rf /tmp/src/frontend | |
ADD ./src/backend/base /app/src/backend/base | |
WORKDIR /app/src/backend/base | |
# again we need these because of workspaces | |
ADD ./pyproject.toml /app/pyproject.toml | |
ADD ./uv.lock /app/uv.lock | |
ADD ./src/backend/base/pyproject.toml /app/src/backend/base/pyproject.toml | |
ADD ./src/backend/base/uv.lock /app/src/backend/base/uv.lock | |
ADD ./src/backend/base/README.md /app/src/backend/base/README.md | |
RUN --mount=type=cache,target=/root/.cache/uv \ | |
uv sync --frozen --no-dev --no-editable | |
################################ | |
# RUNTIME | |
# Setup user, utilities and copy the virtual environment only | |
################################ | |
FROM python:3.12.3-slim AS runtime | |
RUN useradd user -u 1000 -g 0 --no-create-home --home-dir /app/data | |
# and we use the venv at the root because workspaces | |
COPY --from=builder --chown=1000 /app/.venv /app/.venv | |
# Place executables in the environment at the front of the path | |
ENV PATH="/app/.venv/bin:$PATH" | |
LABEL org.opencontainers.image.title=langflow | |
LABEL org.opencontainers.image.authors=['Langflow'] | |
LABEL org.opencontainers.image.licenses=MIT | |
LABEL org.opencontainers.image.url=https://github.com/langflow-ai/langflow | |
LABEL org.opencontainers.image.source=https://github.com/langflow-ai/langflow | |
USER user | |
WORKDIR /app | |
ENV LANGFLOW_HOST=0.0.0.0 | |
ENV LANGFLOW_PORT=7860 | |
CMD ["langflow-base", "run"] | |