Многоступенчатый контейнер докера Python — локальный пакет

#python #docker #docker-multi-stage-build

Вопрос:

Я запускаю многоступенчатую сборку докера для своего контейнера python.

На моем первом этапе сборки устанавливаются все зависимости от requirements.txt

 ################## ## Python Builder Image ################## FROM python:3.10 AS python-builder  # create and activate virtual environment # using final folder name to avoid path issues with packages ENV VIRTUAL_ENV="/home/app_user/venv" RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH"  # install requirements COPY requirements.txt . COPY package/ package/ RUN pip3 install --upgrade pip==21.3.1 RUN pip3 install --no-cache-dir -r requirements.txt  

requirements.txt содержит команду-e для установки пакета. Когда я создаю свой окончательный образ контейнера, приложение выдает ошибку, в которой говорится, что мой пакет не найден.

 ################## ## Final Image ################## FROM python:3.10-alpine3.14 as app  ENV VIRTUAL_ENV="/home/app_user/venv" ENV PATH="$VIRTUAL_ENV/bin:$PATH"  ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV PIP_DISABLE_PIP_VERSION_CHECK=1  USER app_user WORKDIR /home/app_user/code COPY --from=node-builder /imports /imports COPY main.py config.py ./ COPY scripts/ scripts/  CMD gunicorn main:flask_app --worker-tmp-dir /dev/shm -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:$PORT  

Ошибка:

 ModuleNotFoundError: No module named 'package'  

Есть какие-нибудь идеи?

Ответ №1:

Исправлено путем правильной установки пакета в образе конструктора:

 # install requirements COPY requirements.txt . COPY package/ package/ RUN pip3 install --upgrade pip==21.3.1 RUN pip3 install ./package RUN pip3 install --no-cache-dir -r requirements.txt  

По сравнению с предыдущим, requirements.txt:

 constructs==10.0.9 authlib==0.11 flask==2.0.2 uvicorn[standard]==0.15.0 gunicorn==20.1.0 virtualenv -e package ## didn't like this