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 中的端点
我在 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