我要在本地运行python FastAPI,但是当尝试通过容器运行时,在浏览器上没有得到任何响应.也没有错误



我能够在本地运行python FastAPI(连接到本地主机 http://127.0.0.1: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}

Dockerfile 的内容

FROM python:3.9.5
WORKDIR /code
COPY ./docker_req.txt /code/docker_req.txt
RUN pip install --no-cache-dir --upgrade -r /code/docker_req.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0"]

运行容器时在 CMD 上的输出:-

docker run --name my-app1 python-fastapi:1.5
INFO:     Will watch for changes in these directories: ['/code']
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [1] using statreload
INFO:     Started server process [7]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

docker_req.txt——

fastapi==0.73.0
pydantic==1.9.0
uvicorn==0.17.4

在 docker 运行之前插入-d,以在分离模式下运行容器。 尝试运行:

docker run -d --name my-app5 -p 8000:8000 python-fastapi:1.5

更简单:您可以将本地端口8000重定向到docker端口8000

docker run -p 8000:8000 ...

现在您可以使用以下之一访问它

  • http://0.0.0.0:8000
  • http://localhost:8000
  • http://127.0.0.1:8000
>Longer:您可以公开端口8000并使用 dockerIP运行它
docker run --expose 8000 ...

或者Dockerfile您可以使用EXPOSE 8000

接下来你必须找到Container ID

docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS      NAMES
0e7c6c543246   furas/fastapi   "uvicorn app.main:ap…"   3 seconds ago   Up 2 seconds   8000/tcp   stupefied_nash

docker ps -q
0e7c6c543246

并使用(部分)CONTAINER ID获取容器 IP 地址

docker inspect 0e7c | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",

docker inspect --format '{{ .NetworkSettings.IPAddress }}' 0e7c
172.17.0.2

现在您可以使用

  • http://172.17.0.2:8000
<小时 />

编辑:

在一行中(在 Bash 上)

docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q)
172.17.0.2

我通过创建yaml文件并通过docker-compose运行它来解决这个问题

version: '3'
services:
my-app:
image: python-fastapi:1.5
ports:
- 8000:8000

在yaml文件中,我也尝试了没有端口,它仍然有效,而下面的docker run命令不起作用

docker run --name my-app5 -p 8000:8000 python-fastapi:1.5

任何人都可以解释为什么它不能从"docker run"命令工作而是从 yaml 文件工作吗?

最新更新