Deploy fastapi в docker контейнере

Пытаюсь запустить тестовый проект на fastapi на ubuntu 20.04 c docker. Пользуюсь оф доками.

Dockerfile

FROM python:3.8

RUN pip install fastapi uvicorn

EXPOSE 8000

COPY ./app /app

CMD ["uvicorn", "app.main:app", "--host", "127.0.0.1", "--port", "8000"]

main.py

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


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


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

Создаю Docker image так sudo docker build -t myimage . . Потом запускаю в контейнере sudo docker run -d --name mycont -p 8000:8000 myimage.

Контейнер создается. В списке активных контейнеров вижу

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
333ad5104b9f myimage "uvicorn app.main:ap…" 13 seconds ago Up 12 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp mycont

в логах докера

INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on 127.0.0.1:8000 (Press CTRL+C to quit)

Но при переходе по ссылке 127.0.0.1:8000/docs страница не открывается. Подскажите пожалуйста, в чем моя ошибка


Ответы (2 шт):

Автор решения: Exploding Kitten

Попробуйте поменять на:

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

Это происходит потому, что вы явно привязываетесь к локальному адресу внутри контейнера (в данном случае его лучше воспринимать как независимую компьютер находящийся в некой сети), тогда как у контейнера есть несколько сетей, нужная нам это 172.x.x.x. Поэтому мы и указываем --host 0.0.0.0 чтобы запусть сервер на всех доступных адресах на порту 8000, чтобы при публикации порта через -p 8000:8000 наше приложение было доступно.

Ну и пример из документации.

→ Ссылка
Автор решения: Fedor

По поводу именно docs все достаточно скачать swagger-ui и поместить скопировать директорию dist в корневую директорию проекта, тогда docs откроется.введите сюда описание изображения

→ Ссылка