Невозможно запустить сервер Uvicorn/приложение FastAPI через Docker

Я новичок в компьютерных сетях и Docker и пытаюсь развернуть и запустить небольшое приложение FastAPI с помощью Docker. Приложение работает успешно, когда я запускаю его локально с помощью Uvicorn, но не запускается, когда я пытаюсь развернуть его с помощью Docker. Ниже приведено сообщение об ошибке. Моя ОС — Windows. Я получаю:

Невозможно запустить сервер Uvicorn/приложение FastAPI через Docker

источник/main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

Вот мой Dockerfile

FROM python:3.10-slim

WORKDIR /code

COPY ./requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY ./src ./src

CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]

Вот команды, которые я использовал в терминале:

docker build -t fastapi-image . 
docker run --name fastapi-container -p 80:80 fastapi-image

вот мой журнал докера:

INFO:     Will watch for changes in these directories: ['/code']
INFO:     Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
INFO:     Started reloader process [1] using StatReload
INFO:     Started server process [8]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

моя файловая структура:

requirements.txt
Dockerfile
src
|--main.py

требования.txt

fastapi
uvicorn

Как выглядит журнал докера при запуске контейнера? А файловая структура в докер-контейнере?

sandeman_13 27.08.2024 17:56

Эта ссылка помогает? stackoverflow.com/questions/60132045/… Это может быть проблемой, если вы укажете 0.0.0.0 — попробуйте localhost или 127.0.0.1, как сказано в журнале докера.

Ryan 27.08.2024 18:53

Прошу прощения, но я обнаружил, что разместил неправильный файл журнала Docker. Я уже отредактировал свое сообщение, чтобы оно соответствовало правильному файлу журнала Docker. Несмотря на то, что я попробовал оба ваших решения, они мне все равно не помогли.

THANAWUT TIMPITAK 27.08.2024 19:41

Когда вы изменили 0.0.0.0 на 127.0.0.1, вы получили точно такую ​​же ошибку, ERR_ADDRESS_INVALID? Если нет, то на какую ошибку это изменилось?

Vercingatorix 27.08.2024 19:43

для 0.0.0.0 я получил «ERR_ADDRESS_INVALID», но для 127.0.0.1 я получил «ERR_EMPTY_RESPONSE».

THANAWUT TIMPITAK 27.08.2024 19:49

ваш код работает нормально... http://localhost/ ... или используйте curl http://localhost/ ... как видно с моего ноутбука с Ubuntu

Scott Stensland 27.08.2024 19:50

Как уже говорили другие, 0.0.0.0 — это действительный адрес прослушивания, но неверный адрес подключения. 0.0.0.0 означает, что сервер должен прослушивать «все адреса на интерфейсах». 127.0.0.1 и localhost — локальный («петлевой») интерфейс вашей собственной машины.

Codebling 27.08.2024 19:56

Может у вас что-то противоречивое? Нажмите docker container ls (это эль, а не «и») и убедитесь, что ничего не указано. Затем попробуйте подключиться и убедитесь, что вы получили ERR_CONNECTION_REFUSED или что-то подобное. Затем перезапустите свой докер-контейнер (docker run --name fastapi-container -p 80:80 fastapi-image) и посмотрите, работает ли он теперь, когда вы пытаетесь перейти к 127.0.0.1

Vercingatorix 27.08.2024 20:57

Возможно, этот ответ окажется для вас полезным.

Chris 28.08.2024 06:37
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
9
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Воспроизведя проблему, вы можете увидеть результат на localhost:80.

См. также эти посты, чтобы узнать больше о различиях между localhost и 0.0.0.0:

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

Драйвер Selenium Chrome в контейнере Docker не запускается
Spring Boot Jar не может найти файлы автоматической конфигурации
Конфигурация, позволяющая веб-серверу использовать сертификаты, установленные при развертывании Kubernetes
Реестр контейнеров Azure недоступен через частную конечную точку [403 запрещено]
Как развернуть приложение Angular 18 SSR с помощью Docker, docker-compose и NGINX?
Ошибка Kubernetes 502 Bad Gateway: сбой подключения() (111: соединение отклонено) при подключении к восходящему каналу
(111: Соединение отклонено) при подключении к восходящему каналу — многоконтейнерное приложение NGINX/Docker
(InaccessibleImage) Изображение из экземпляра контейнера Azure
Пользовательской игре не хватает доступа на запись в журнал с помощью Docker Compose
Подключение к серверу на «localhost» (::1), порт 5432 не удалось: соединение отклонено. Сервер работает на этом хосте и принимает соединения TCP/IP?