Я пытаюсь 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: неизвестно






В показанной вами настройке есть две очевидные проблемы.
В файле 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/