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 шт):
Попробуйте поменять на:
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 наше приложение было доступно.
Ну и пример из документации.
По поводу именно docs все достаточно скачать swagger-ui и поместить скопировать директорию dist в корневую директорию проекта, тогда docs откроется.