# Stage 1: Build the frontend (Node.js) FROM node:21.7.2-bookworm-slim AS frontend-builder WORKDIR /app # Copy frontend package files and install dependencies COPY ./frontend/package.json ./frontend/package-lock.json ./ RUN npm install -g npm@10.5.1 && npm ci # Copy frontend source code and build COPY ./frontend ./ RUN npm run build # Stage 2: Build the backend dependencies (Python) FROM python:3.12.3-slim AS backend-builder WORKDIR /app ENV PYTHONPATH='/app' # Set Poetry environment variables for dependency management ENV POETRY_NO_INTERACTION=1 \ POETRY_VIRTUALENVS_IN_PROJECT=1 \ POETRY_VIRTUALENVS_CREATE=1 \ POETRY_CACHE_DIR=/tmp/poetry_cache # Install system dependencies and Poetry RUN apt-get update -y && \ apt-get install -y curl make git build-essential && \ python3 -m pip install poetry==1.8.2 --break-system-packages # Copy Poetry files and install dependencies COPY ./pyproject.toml ./poetry.lock ./ RUN touch README.md RUN poetry install --without evaluation,llama-index --no-root && rm -rf $POETRY_CACHE_DIR # Stage 3: Final runtime image FROM python:3.12.3-slim AS openhands-app WORKDIR /app # Define build argument and environment variables ARG OPENHANDS_BUILD_VERSION=dev ENV RUN_AS_OPENHANDS=true \ OPENHANDS_USER_ID=42420 \ SANDBOX_LOCAL_RUNTIME_URL=http://host.docker.internal \ USE_HOST_NETWORK=false \ WORKSPACE_BASE=/opt/workspace_base \ OPENHANDS_BUILD_VERSION=$OPENHANDS_BUILD_VERSION \ SANDBOX_USER_ID=0 \ FILE_STORE=local \ FILE_STORE_PATH=/.openhands-state # Create necessary directories RUN mkdir -p $FILE_STORE_PATH $WORKSPACE_BASE # Install runtime dependencies RUN apt-get update -y && \ apt-get install -y curl ssh sudo && \ apt-get clean # Adjust UID range in login.defs to avoid conflicts RUN sed -i 's/^UID_MIN.*/UID_MIN 499/' /etc/login.defs && \ sed -i 's/^UID_MAX.*/UID_MAX 1000000/' /etc/login.defs # Create user and group for OpenHands RUN groupadd app && \ useradd -l -m -u $OPENHANDS_USER_ID -s /bin/bash openhands && \ usermod -aG app openhands && \ usermod -aG sudo openhands && \ echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers # Copy backend dependencies from backend-builder COPY --from=backend-builder /app/.venv ./.venv # Copy frontend build artifacts from frontend-builder COPY --from=frontend-builder /app/dist ./frontend/dist # Copy the rest of the application code COPY . . # Expose port for the application EXPOSE 3000 # Command to run the application CMD ["./.venv/bin/python", "-m", "openhands.server.listen"]