########### # BUILDER # ########### # pull official base image FROM python:3.11-slim-bookworm AS builder # set working directory WORKDIR /usr/src/app # set environment variables ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV ENVIRONMENT=dev ENV TESTING=1 ENV CUDA_VISIBLE_DEVICES="" # install python dependencies RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pipenv && rm -rf ~/.cache/pip COPY ./Pipfile . RUN pipenv install --deploy --dev --no-cache-dir RUN pipenv run pip install torch --force-reinstall --no-cache-dir # remove all cached files not needed to save space RUN pip cache purge RUN rm -rf /root/.cache # Create cache directory and set permissions RUN mkdir -p /home/app/.cache/huggingface RUN chown -R app:app /home/app/.cache/huggingface RUN chown -R app:app $APP_HOME # # add app COPY . /usr/src/app RUN export DEEPSEEK_API_KEY=sk-XXXXXXXXXX; export TAVILY_API_KEY=tvly-dev-wXXXXXX;\ pipenv run pytest tests --disable-warnings RUN pipenv run flake8 . RUN pipenv run black --exclude=migrations . --check RUN pipenv run isort . --check-only ######### # FINAL # ######### # pull official base image FROM python:3.11-slim-bookworm # create directory for the app user RUN mkdir -p /home/app # create the app user RUN addgroup --system app && adduser --system --group app # create the appropriate directories ENV HOME=/home/app ENV APP_HOME=/home/app/backend RUN mkdir $APP_HOME WORKDIR $APP_HOME # set environment variables ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV ENVIRONMENT=prod ENV TESTING=0 # install python dependencies RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pipenv && rm -rf ~/.cache/pip COPY --from=builder /usr/src/app/Pipfile . RUN pipenv install --deploy RUN pipenv run pip install "uvicorn[standard]==0.26.0" # add app COPY . $APP_HOME # chown all the files to the app user RUN chown -R app:app $APP_HOME # change to the app user USER app # expose the port the app runs on EXPOSE 80 # run uvicorn CMD ["pipenv", "run", "uvicorn", "main:app", "--reload", "--workers", "1", "--host", "0.0.0.0", "--port", "80"]