# Отдельный сборочный образ
FROM python:3.9-slim-bullseye as compile-image
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt
# Итоговый образ, в котором будет работать бот
FROM python:3.9-slim-bullseye
COPY --from=compile-image /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
WORKDIR /app
COPY bot /app/bot
CMD ["python", "-m", "bot"]
Есть такой конфиг Dockerfile`а.
Вопрос, я думаю, не по теме Docker, а, скорее, по Linux.
Да, он глупый, но себе я на него еще не ответил.
Как я рассуждаю:
В строке
RUN python -m venv /opt/venv
мы создаем виртуальное окружение по пути /opt/venv.
ENV PATH="/opt/venv/bin:$PATH"
- здесь мы добавляем путь до директории ранее созданного виртуального окружения с запускаемым файлом
activate в переменную окружения
PATH.
COPY --from=compile-image /opt/venv /opt/venv
- берем результат первой сборки и копируем во вторую.
ENV PATH="/opt/venv/bin:$PATH"
- снова добавляем путь в переменную окружения.
WORKDIR /app
и
COPY bot /app/bot
- создаем и копируем в рабочую директорию /app папку bot из локального места сборки образа.
Примечание:
Значение флага -p у python
-m module-name
Searches sys.path for the named module and runs the corresponding .py file as a script.
CMD ["python", "-m", "bot"]
- запускаем модуль bot? В примечании сверху сказано 'ищет в PATH заданный модуль и запускает соответствующий файл .py'. Но ведь мы не передавали модуль bot в переменную окружения. Мы не активировали виртуальное окружение.