Запуск процесса контейнера вызвал: exec: "fastapi": исполняемый файл не найден в $PATH: неизвестно

Я пытаюсь Dockerize свое приложение fastapi, но оно терпит неудачу со следующей ошибкой

Ответ об ошибке от демона: не удалось создать задачу для контейнера: не удалось создать задачу оболочки: не удалось создать среду выполнения OCI: не удалось создать запуск: невозможно запустить процесс контейнера: exec: «fastapi»: исполняемый файл не найден в $PATH: неизвестно

Кто-нибудь может мне помочь?

Докерфайл

FROM python:3.12 as builder

# install and setup poetry config
RUN pip install poetry==1.8.2

ENV POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_IN_PROJECT=1 \
    POETRY_VIRTUALENVS_CREATE=1 \
    POETRY_CACHE_DIR=/tmp/poetry_cache

WORKDIR /navigation

COPY pyproject.toml poetry.lock ./
# poetry complains if there is no README file
RUN touch README.md

# install without dev dependencies + remove poetry cache
RUN poetry install --without dev && rm -rf $POETRY_CACHE_DIR

FROM python:3.12-alpine as runtime

ENV VIRTUAL_ENV=/navigation/.venv \
    PATH = "/navigation/.venv/bin:$PATH"

COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}

COPY navigation ./navigation

CMD ["fastapi", "run", "main.py", "--proxy-headers", "--port", "80"]

docker-compose.yml

services:
  navigation-api:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./navigation:/navigation

Я использую поэзию (как видно из файла Dockerfile) для установки зависимостей. Вот мои зависимости в файле pyproject.toml.

pyproject.toml

[tool.poetry.dependencies]
python = ">=3.12,<3.13"
fastapi = "^0.111.0"
prisma = "^0.13.1"

Я также пытался использовать uvicorn вместо fastapi-cli, но возникает та же ошибка.

Я старался не использовать шаблон строителя, чтобы проверить, есть ли в этом проблема. Но та же ошибка.

Я проверил этот билет, но никакие предложенные решения не помогли: запуск процесса контейнера вызвал: exec: "uvicorn": исполняемый файл не найден в $PATH: неизвестно

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
284
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В показанной вами настройке есть две очевидные проблемы.

В файле Compose следует удалить:

    volumes:
      - ./navigation:/navigation

При этом каталог /navigation в образе — все, что устанавливает Dockerfile, кроме базового образа, — перезаписывается содержимым с хоста. Это включает в себя вашу виртуальную среду, которая находится в /navigation/.env. Вероятно, это непосредственно вызывает ошибку, которую вы видите.

(Если для вас важно, чтобы работающая программа видела код в вашей локальной системе без пересборки образа, эта настройка почти похожа на обычную виртуальную среду Python, за исключением того, что вы поместили интерпретатор Python в контейнер, где его трудно запустить, и IDE сложно это увидеть. Лучше использовать простую виртуальную среду без Docker.)

В Dockerfile базовые образы двух этапов сборки должны совпадать. Ваша текущая настройка выглядит так:

FROM python:3.12 as builder
...
FROM python:3.12-alpine as runtime  # <-- doesn't match first stage
COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}

Виртуальные среды могут быть чрезвычайно специфичными для Python, на котором они созданы. Вы можете столкнуться с некоторыми неясными ошибками, которые трудно отладить, если два Python не совпадают в точности. В частности, для Python я бы рекомендовал обычно использовать образы на основе Debian (без суффикса или с суффиксом «-slim»), а не Alpine, поскольку образы на основе Debian часто могут устанавливать предварительно скомпилированные образы в формате «колесо», не требуя набор инструментов C.

ценю ваш ответ. Это решило мою проблему, особенно конфигурацию тома в файле docker-compose.yml. Первоначально целью было скопировать папку .venv ИЗ контейнера на локальный хост. Не понял, что можно сделать наоборот и перезаписать содержимое ./navigation/

kanadianDri3 02.06.2024 04:38

такое ощущение, что я делаю это не так аккуратно, как должно быть. Есть ли дополнительные советы, которым мне следует следовать?

kanadianDri3 02.06.2024 04:42

Другие вопросы по теме