Dockerized flask web 应用程序抛出 403 Forbidden

Dockerized flask web app throws 403 Forbidden

我在 Flask 中实现了基本的 REST API。我想尝试使用 Docker 将其容器化。我是 Docker 的新手,但根据我在各种论坛上的了解,这就是我设置的内容。

Docker文件

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"]

requirements.txt

Flask==2.0.2

然后我去航站楼,运行 $ docker build -t myapp:latest .

构建成功,我可以在 Docker 桌面应用程序中看到 my app

然后我运行

$ 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)

Docker 桌面显示 myapp 正在使用中。

到目前为止,还不错。但这是我开始 运行 解决问题的地方。

我也在使用 Postman 进行 API 路由测试。如果我要 运行 Docker 之外的应用程序,然后转到 127.0.0.1:5000/data 或我的任何其他路线,我会得到很好的响应。但是使用 Docker 构建 运行ning,我无法再访问此路由或任何其他路由。

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

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

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

我真的不知道该做什么或从这里去哪里,我尝试过的每一个来源都让我对我已经尝试过的东西有轻微的变化,而且我离实现这个目标还差得很远工作。请帮忙,谢谢。

在 dockerfile 中你需要公开你的端口

...
ENV FLASK_APP="app.py"
EXPOSE 5000
CMD ["python3", "-m" , "flask", "run"]

您的 docker 应用程序 运行 在容器内的端口 5000 上,但是在您的 docker run 命令中您正在绑定 port 8080,容器内的端口 8080 应该是 5000。由于容器内的端口 8080 上没有任何东西 运行,因此您会收到 403 错误

命令应该是

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

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

127.0.0.1:8080/data # access from host machine

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

我刚刚注意到,您没有在 internet/external 使用时公开应用程序,在 Dockerfile 的最后一行添加 arg "--host=0.0.0.0"

CMD ["python3", "-m" , "flask", "run", "--host=0.0.0.0"]

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

这最终成功了,谢谢@Tasnuva

Dockerfile,在 CMD 后附加 --host

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

在 CLI 中, $ docker run --rm -it -p 8080:5000 myapp:latest

127.0.0.1:8080

访问 Postman 中的端点