Dockerized Flask Web 应用程序抛出 403 Forbidden

dan*_*oll 1 python flask docker

我在 Flask 中实现了一个基本的 REST API。我想尝试使用 Docker 将其容器化。我对 Docker 完全陌生,但根据我在各种论坛上了解到的内容,这就是我所设置的。

Dockerfile

FROM python:3.8-alpine

WORKDIR /myapplication

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .
ENV FLASK_APP="app.py"

CMD ["python3", "-m" , "flask", "run"]
Run Code Online (Sandbox Code Playgroud)

要求.txt

Flask==2.0.2
Run Code Online (Sandbox Code Playgroud)

然后我去终端,然后运行 $ docker build -t myapp:latest .

构建成功,我可以my app在 Docker Desktop 应用程序中看到列出的信息

然后我跑

$ docker run --rm -it -p 8080:8080 myapp:latest

 * Serving Flask app 'app.py' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Run Code Online (Sandbox Code Playgroud)

Docker Desktop 显示myapp正在使用中。

到目前为止,一切都很好。但这就是我开始遇到问题的地方。

我还使用 Postman 进行 API 路由测试。如果我要在 Docker 之外运行应用程序,并且我转到127.0.0.1:5000/data或任何其他路线,我会得到很好的响应。但是随着 Docker 构建的运行,我不再能够访问该路由或任何其他路由。

我尝试了无数的组合:127.0.0.1:5000、127.0.0.1:8080、localhost、localhost:5000、localhost:8080,但无济于事。

唯一给我任何回应的是 127.0.0.1:5000。我得到的响应是 a 403 Forbidden,邮递员说“该请求是合法请求,但服务器拒绝响应它。”

就其价值而言,我在新的 M1 Pro MacBook 上运行它。我知道新的 Mac 对权限很敏感,所以如果权限是问题,我不会感到惊讶。

我真的不知道该做什么或从这里去哪里,我尝试过的每一个来源都给了我与我已经尝试过的略有不同的东西,而且我离让它发挥作用还很远。请帮忙,谢谢。

Tas*_*eya 6

您的 docker 应用程序正在5000容器内的端口上运行,但在您的 dockerrun命令中,您将port8080 与容器内的端口绑定在一起8080,而容器内的端口应该是5000。由于容器内的端口上没有任何内容正在运行,8080因此您会收到403错误

命令应该是

docker run --rm -it -p 8080:5000 myapp:latest
Run Code Online (Sandbox Code Playgroud)

从主机,您可以在端口 8080 上访问该应用程序,即:

127.0.0.1:8080/data # access from host machine
Run Code Online (Sandbox Code Playgroud)

127.0.0.1:5000/data # 从容器内部访问

我刚刚注意到,您没有在互联网/外部使用上公开该应用程序,在 Dockerfile 的最后一行添加 arg“--host=0.0.0.0”

CMD ["python3", "-m" , "flask", "run", "--host=0.0.0.0"]
Run Code Online (Sandbox Code Playgroud)

docker 构建并发布端口后,您应该能够访问该应用程序。