无法在 Docker 容器中使用 Gunicorn 连接 Flask 应用程序

4
我是一名有用的助手,可以为您翻译文本。
我有一个Flask应用程序,正在尝试使用gunicorn在Docker容器中运行它。
这是我的Dockerfile。
FROM python:3.6

WORKDIR /app

COPY ./requirements.txt /.requirements.txt

COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

EXPOSE 8000

ENV FLASK_APP=<some_name>
ENV FLASK_ENV=development


CMD gunicorn -b :8000 -w 4 app:app

这是我运行容器的方式 -

docker run <name>

这是我测试它的方式 -

    curl -X POST http://172.17.0.2:8000/login -H 'cache-control: no-cache' -H 'content-type: application/json' -d '<SOME_PAYLOAD>'
curl: (7) Failed to connect to 172.17.0.2 port 8000: Operation timed out

我在这个网站上查看了几个答案

据我所知,我正在执行以下操作:

  1. 暴露端口
  2. 访问正确的IP地址
  3. 在我的主机上访问正确的端口
  4. 将主机计算机上的端口映射到我的docker容器上。

为什么此操作超时?

我还尝试过:

  1. CMD gunicorn -b 0.0.0.0:8000 -w 4 app:app 这应该映射所有内容
  2. docker run -p 8000:8000 iterative,这应该强制在主机和容器之间进行端口映射。

但是都没有成功。

在我的计算机上,应用程序运行良好。

为什么它在docker容器中无法正常工作?

3个回答

1
我也遇到了这个问题,问题当然是我在工具链的某个地方指定了不同的端口。
请仔细检查您的端口!

app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "example"

Dockerfile
FROM foo-image:tag
...
RUN pip3 install gunicorn Flask
COPY *.py /app/
WORKDIR /app
EXPOSE 8001
CMD ["gunicorn", "-b", "0.0.0.0:8001", "--workers", "2", "app:app"]

运行命令
https://docs.docker.com/engine/reference/run/#expose-incoming-ports

docker run -p 8001:8001 "$CONTAINER_TAG"

1

你的 Docker 容器运行方式不正确

docker run -p 8080:8080 <the-name-of-your-image>

假设您的Dockerfile获取了正确的文件,这应该解决问题。
转到localhost:8080进行验证。

1
根据我的经验,当处理flask的gunicorn和docker时,我发现以下方法更为有效。建议您按以下方式在Dockerfile中运行CMD:
CMD ["gunicorn", "-b", "0.0.0.0:8000", "<scriptname>:<runtimefunction>"]

在您的情况下,脚本名称很可能是“app.py”,运行时函数为“app”。只是为了说明我正在建议什么:
在app.py中:
from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, World!"

if __name__ == "__main__":
    app.run(debug=True)

将工人也添加进去:
CMD ["gunicorn", "-w", "5", "-b", "0.0.0.0:8000", "<scriptname>:<runtimefunction>"]

希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接