/ Dockerfile
Dockerfile
1 # syntax=docker/dockerfile:1 2 FROM ubuntu:jammy AS base 3 LABEL homepage="https://khoj.dev" 4 LABEL repository="https://github.com/khoj-ai/khoj" 5 LABEL org.opencontainers.image.source="https://github.com/khoj-ai/khoj" 6 LABEL org.opencontainers.image.description="Your second brain, containerized for personal, local deployment." 7 8 # Install System Dependencies 9 RUN apt update -y && apt -y install \ 10 python3-pip \ 11 swig \ 12 curl \ 13 # Required by RapidOCR 14 libgl1 \ 15 libglx-mesa0 \ 16 libglib2.0-0 \ 17 docker.io \ 18 # Required by llama-cpp-python pre-built wheels. See #1628 19 musl-dev && \ 20 ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1 && \ 21 # Clean up 22 apt clean && rm -rf /var/lib/apt/lists/* 23 24 # Build Server 25 FROM base AS server-deps 26 WORKDIR /app 27 COPY pyproject.toml . 28 COPY README.md . 29 ARG VERSION=0.0.0 30 # use the pre-built llama-cpp-python, torch cpu wheel 31 ENV PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu https://abetlen.github.io/llama-cpp-python/whl/cpu" 32 # avoid downloading unused cuda specific python packages 33 ENV CUDA_VISIBLE_DEVICES="" 34 RUN sed -i "s/dynamic = \\[\"version\"\\]/version = \"$VERSION\"/" pyproject.toml && \ 35 pip install --no-cache-dir . 36 37 # Build Web App 38 FROM oven/bun:1-alpine AS web-app 39 # Set build optimization env vars 40 ENV NODE_ENV=production 41 ENV NEXT_TELEMETRY_DISABLED=1 42 WORKDIR /app/src/interface/web 43 # Install dependencies first (cache layer) 44 COPY src/interface/web/package.json src/interface/web/bun.lock ./ 45 RUN bun install --frozen-lockfile 46 # Copy source and build 47 COPY src/interface/web/. ./ 48 RUN bun run build 49 50 # Merge the Server and Web App into a Single Image 51 FROM base 52 ENV PYTHONPATH=/app/src 53 WORKDIR /app 54 COPY --from=server-deps /usr/local/lib/python3.10/dist-packages /usr/local/lib/python3.10/dist-packages 55 COPY --from=web-app /app/src/interface/web/out ./src/khoj/interface/built 56 COPY . . 57 RUN cd src && python3 khoj/manage.py collectstatic --noinput 58 59 # Run the Application 60 # There are more arguments required for the application to run, 61 # but those should be passed in through the docker-compose.yml file. 62 ARG PORT=42110 63 EXPOSE ${PORT} 64 ENTRYPOINT ["python3", "src/khoj/main.py"]