Spaces:
Running
Running
| # --------------------- | |
| # Builder Stage | |
| # --------------------- | |
| FROM python:3.10-slim as builder | |
| WORKDIR /build | |
| # Install git and other dependencies | |
| RUN apt-get update && \ | |
| apt-get install -y git && \ | |
| rm -rf /var/lib/apt/lists/* | |
| # Arguments for secrets | |
| ARG GIT_USER | |
| ARG GIT_TOKEN | |
| ARG GIT_REPO_LIST | |
| # Clone private repositories using build-time secrets | |
| RUN --mount=type=secret,id=GIT_USER,mode=0444,required=true \ | |
| --mount=type=secret,id=GIT_TOKEN,mode=0444,required=true \ | |
| --mount=type=secret,id=GIT_REPO_LIST,mode=0444,required=true \ | |
| repos=$(cat /run/secrets/GIT_REPO_LIST) && \ | |
| first_repo=true && \ | |
| for repo in $repos; do \ | |
| echo "Cloning repository -> $repo" && \ | |
| git clone https://$(cat /run/secrets/GIT_USER):$(cat /run/secrets/GIT_TOKEN)@github.com/$(cat /run/secrets/GIT_USER)/$repo.git; \ | |
| if [ "$first_repo" = true ]; then \ | |
| echo "$repo" > /build/main_repo_dir.txt && \ | |
| first_repo=false; \ | |
| else \ | |
| echo "Installing dependency repository: $repo" && \ | |
| pip install --no-cache-dir /build/$repo; \ | |
| fi; \ | |
| done | |
| # Debug: List out the structure | |
| RUN echo "Cloned repositories in builder stage:" && ls -la /build && \ | |
| echo "Primary repository directory name:" && cat /build/main_repo_dir.txt && \ | |
| echo "Contents of the primary repository:" && ls -la /build/$(cat /build/main_repo_dir.txt) | |
| # --------------------- | |
| # Final Stage | |
| # --------------------- | |
| FROM python:3.10-slim | |
| # Set the working directory | |
| WORKDIR /usr/src/app | |
| # Install git in the final image | |
| RUN apt-get update && \ | |
| apt-get install -y git && \ | |
| rm -rf /var/lib/apt/lists/* | |
| # Copy from builder | |
| COPY --from=builder /build /usr/src/app | |
| # Reinstall the numerology app (assuming the main code is in /usr/src/app/numerology_reading) | |
| RUN pip install --no-cache-dir /usr/src/app/numerology_reading | |
| # Ensure Python can find your code | |
| ENV PYTHONPATH="/usr/src/app:$PYTHONPATH" | |
| # Read the main repo directory | |
| RUN MAIN_REPO_DIR=$(cat /usr/src/app/main_repo_dir.txt) && \ | |
| echo "Primary repository is $MAIN_REPO_DIR" && \ | |
| cp -r /usr/src/app/$MAIN_REPO_DIR /usr/src/app/main_app && \ | |
| if [ -f /usr/src/app/main_app/private_repo/requirements.txt ]; then \ | |
| pip install --no-cache-dir -r /usr/src/app/main_app/private_repo/requirements.txt; \ | |
| fi | |
| # ----------------------------------------------- | |
| # Grant system-wide permissions to /usr/src/app | |
| # ----------------------------------------------- | |
| RUN chmod -R 777 /usr/src/app | |
| # Expose port for your numerology API | |
| EXPOSE 7860 | |
| # Switch to the final directory (if your "app.py" or "app:app" is here) | |
| WORKDIR /usr/src/app/main_app/private_repo | |
| RUN echo "Installed packages in the workdir:" && pip freeze | |
| # Debug: List files | |
| RUN echo "Files in /usr/src/app/main_app/private_repo:" && ls -la | |
| # Start uvicorn on container run | |
| CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"] | |