mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-04 23:00:30 +08:00
Unify open-source and closed-source Dockerfile expect nginx 1. per install tools to base image 2. fix copy nginx config 3. fix copy entrypoint*.sh 4. fix go ci error 5. add comment
120 lines
4.7 KiB
Docker
120 lines
4.7 KiB
Docker
# builder stage
|
|
FROM infiniflow/ragflow-base:v2.1 AS builder
|
|
USER root
|
|
SHELL ["/bin/bash", "-c"]
|
|
ARG NEED_MIRROR=0
|
|
|
|
WORKDIR /ragflow
|
|
|
|
# install dependencies from uv.lock file
|
|
COPY pyproject.toml uv.lock ./
|
|
|
|
# https://github.com/astral-sh/uv/issues/10462
|
|
# uv records index url into uv.lock but doesn't failover among multiple indexes
|
|
# Also rewrite pypi.tuna.tsinghua.edu.cn to mirrors.aliyun.com/pypi so locks
|
|
# that were resolved against the Tsinghua mirror (e.g. when UV_INDEX pointed
|
|
# there) get normalized to the Aliyun mirror in NEED_MIRROR=1 builds. Without
|
|
# this, stale Tsinghua URLs slip through and `uv sync --frozen` 404s on
|
|
# packages that the Tsinghua mirror no longer carries.
|
|
RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \
|
|
if [ "$NEED_MIRROR" == "1" ]; then \
|
|
sed -i 's|pypi.org|mirrors.aliyun.com/pypi|g' uv.lock; \
|
|
sed -i 's|pypi.tuna.tsinghua.edu.cn|mirrors.aliyun.com/pypi|g' uv.lock; \
|
|
else \
|
|
sed -i 's|mirrors.aliyun.com/pypi|pypi.org|g' uv.lock; \
|
|
sed -i 's|pypi.tuna.tsinghua.edu.cn|pypi.org|g' uv.lock; \
|
|
sed -i 's|gitee.com|github.com|g' uv.lock; \
|
|
fi; \
|
|
# --refresh-package litellm forces a re-download of litellm from the
|
|
# (post-sed) URLs in uv.lock even if BuildKit's persistent uv cache mount
|
|
# holds a stale wheel from a previous build. litellm 1.88.x has had
|
|
# multiple internal ImportError issues (1.88.1 missing
|
|
# DEFAULT_HEALTH_CHECK_STALENESS_MULTIPLIER, 1.88.0 wheel pulled via
|
|
# some proxies missing RedisPipelineLpopOperation) — always re-fetching
|
|
# the locked version avoids serving a half-broken cached copy.
|
|
uv sync --python 3.13 --frozen --refresh-package litellm && \
|
|
# Ensure pip is available in the venv for runtime package installation (fixes #12651)
|
|
.venv/bin/python3 -m ensurepip --upgrade
|
|
|
|
# Install frontend dependencies — depends only on package manifests so
|
|
# web source / docs changes don't invalidate this layer.
|
|
COPY web/package.json web/package-lock.json web/.npmrc ./web/
|
|
RUN --mount=type=cache,id=ragflow_npm,target=/root/.npm,sharing=locked \
|
|
cd web && NODE_OPTIONS="--max-old-space-size=8192" npm install
|
|
|
|
# Copy full web source and docs for the frontend build.
|
|
COPY web web
|
|
COPY docs docs
|
|
RUN --mount=type=cache,id=ragflow_npm,target=/root/.npm,sharing=locked \
|
|
cd web && NODE_OPTIONS="--max-old-space-size=8192" VITE_BUILD_SOURCEMAP=false VITE_MINIFY=esbuild npm run build
|
|
|
|
# Get version from git (mount .git directory to compute version dynamically)
|
|
RUN --mount=type=bind,source=.git,target=/ragflow/.git \
|
|
version_info=$(git describe --tags --match=v* --first-parent --always); \
|
|
echo "RAGFlow version: $version_info"; \
|
|
echo "$version_info" > /ragflow/VERSION
|
|
|
|
# production stage
|
|
FROM infiniflow/ragflow-base:v2.1 AS production
|
|
USER root
|
|
|
|
WORKDIR /ragflow
|
|
|
|
# Copy Python environment and packages
|
|
ENV VIRTUAL_ENV=/ragflow/.venv
|
|
COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
|
|
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
|
|
|
|
ENV PYTHONPATH=/ragflow/
|
|
# copy entrypoint.sh and entrypoint-pasar.sh
|
|
COPY docker/service_conf.yaml.template ./conf/service_conf.yaml.template
|
|
COPY docker/entrypoint*.sh ./
|
|
RUN chmod +x ./entrypoint*.sh
|
|
|
|
|
|
ARG NGINX_VERSION=1.31.3-1~noble
|
|
RUN --mount=type=cache,id=ragflow_apt,target=/var/cache/apt,sharing=locked \
|
|
mkdir -p /etc/apt/keyrings && \
|
|
curl --retry 5 --retry-delay 2 --retry-all-errors -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor -o /etc/apt/keyrings/nginx-archive-keyring.gpg && \
|
|
echo "deb [signed-by=/etc/apt/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/mainline/ubuntu/ noble nginx" > /etc/apt/sources.list.d/nginx.list && \
|
|
apt -o Acquire::Retries=5 update && \
|
|
apt -o Acquire::Retries=5 install -y nginx=${NGINX_VERSION} && \
|
|
apt-mark hold nginx
|
|
|
|
|
|
# Copy nginx configuration for frontend serving
|
|
# OpenResty installs to /usr/local/openresty/nginx/; create /etc/nginx/ symlink tree
|
|
RUN mkdir -p /etc/nginx/conf.d /var/log/nginx
|
|
|
|
COPY docker/nginx/nginx.conf docker/nginx/proxy.conf /etc/nginx/
|
|
COPY docker/nginx/ragflow.conf.golang \
|
|
docker/nginx/ragflow.conf.python \
|
|
docker/nginx/ragflow.conf.hybrid \
|
|
/etc/nginx/conf.d/
|
|
|
|
RUN rm -f /etc/nginx/sites-enabled/default
|
|
|
|
COPY admin admin
|
|
COPY api api
|
|
COPY conf conf
|
|
COPY deepdoc deepdoc
|
|
COPY rag rag
|
|
COPY agent agent
|
|
COPY pyproject.toml uv.lock ./
|
|
COPY mcp mcp
|
|
COPY common common
|
|
COPY memory memory
|
|
COPY bin bin
|
|
COPY tools/scripts tools/scripts
|
|
|
|
# Copy compiled web pages
|
|
COPY --from=builder /ragflow/web/dist /ragflow/web/dist
|
|
|
|
# Copy version info
|
|
COPY --from=builder /ragflow/VERSION /ragflow/VERSION
|
|
|
|
# Set environment variables
|
|
ENV HF_ENDPOINT=https://hf-mirror.com
|
|
|
|
ENTRYPOINT ["./entrypoint.sh"]
|