### ------ ### The builder image, used to build the virtual environment ### ------ # Start with a minimal Python 3.11 base image based on Debian Buster FROM python:3.12.7-slim ### ------ ### Set up user ### ------ RUN useradd -m -u 1000 user ### ------ ### Set up Python environment variables ### ------ # Ensures Python output is sent directly to the terminal (no buffering) ENV PYTHONUNBUFFERED=1 \ # Prevents Python from writing .pyc files (compiled bytecode) PYTHONDONTWRITEBYTECODE=1 \ ### pip configuration to optimize the installation process # Do not cache pip packages PIP_NO_CACHE_DIR=off \ # Disable pip version checking PIP_DISABLE_PIP_VERSION_CHECK=on \ # Set a longer timeout for pip commands (100 seconds) PIP_DEFAULT_TIMEOUT=100 \ ### poetry configuration to install and manage dependencies # Set the version of Poetry to use POETRY_VERSION=1.4.2 \ # Define the location where Poetry will be installed POETRY_HOME="/opt/poetry" \ #POETRY_HOME="/home/user/.local" \ # Create the virtual environment inside the project folder POETRY_VIRTUALENVS_IN_PROJECT=true \ # Ensure Poetry creates virtual environments for the project POETRY_VIRTUALENVS_CREATE=1 \ # Prevent Poetry from asking for interactive input during install POETRY_NO_INTERACTION=1 \ ### Define paths for the virtual environment and Python setup # Define where Python setup files will reside PYSETUP_PATH="/opt/pysetup" \ # Define where the virtual environment will be created VENV_PATH="/opt/pysetup/.venv" \ # Set Hugging Face to offline mode to avoid network access HF_HUB_OFFLINE=0 \ # NLTK NLTK_DATA="/home/user/nltk/" \ # Store files DATA_DIR="/api/data/" \ # Set the custom Poetry configuration directory POETRY_CONFIG_DIR="$POETRY_HOME/.config/pypoetry" \ # Crypt PASSLIB_BUILTIN_BCRYPT="enabled" # Add Poetry and virtual environment to the system PATH (Note add after declared ENV) ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" ### ------ ### Package ### ------ # Update package lists and install required build dependencies RUN apt-get update \ && apt-get install --no-install-recommends -y \ # Install curl to download files from the internet curl \ # Install essential build tools (for building Poetry and other packages) build-essential \ wget \ git \ openssh-client \ && curl -sSL https://install.python-poetry.org | python3 - \ # Remove build tools after installation to reduce image size && apt-get purge -y --auto-remove build-essential \ # Clean up apt cache to minimize image size && apt-get clean \ # Remove leftover lists to further reduce image size && rm -rf /var/lib/apt/lists/* WORKDIR / ### ------ ### Copy from Repo ### ------ RUN mkdir -p /langworkflow RUN --mount=type=secret,id=TAG_WORKFLOW,mode=0444,required=true \ --mount=type=secret,id=URL_WORKFLOW,mode=0444,required=true \ git clone --branch $(cat /run/secrets/TAG_WORKFLOW) $(cat /run/secrets/URL_WORKFLOW) /langworkflow RUN mkdir -p /api RUN --mount=type=secret,id=TAG_PROJECT,mode=0444,required=true \ --mount=type=secret,id=URL_PROJECT,mode=0444,required=true \ git clone --branch $(cat /run/secrets/TAG_PROJECT) $(cat /run/secrets/URL_PROJECT) /api ### ------ ### Create DIRs ### ------ # Create the custom Poetry configuration directory and set permissions RUN mkdir -p $POETRY_CONFIG_DIR && \ # Create the NTLK folder mkdir -p $NLTK_DATA && \ # Create the folder store files mkdir -p $DATA_DIR && \ chown -R user:user $POETRY_CONFIG_DIR && \ chown -R user:user $NLTK_DATA && \ chown -R user:user $DATA_DIR && \ chmod -R 777 $DATA_DIR ### ------ ### Install Libs ### ------ WORKDIR /api RUN poetry install --no-root && rm -rf $POETRY_CACHE_DIR ### ------ ### Command to run ### ------ USER user # Expose the port FastAPI will run on EXPOSE 7860 # This command starts the API using Poetry's virtual environment CMD ["poetry", "run", "api"]