无法在docker容器中使用gunicorn连接到烧瓶应用程序

时间:2019-04-02 12:03:26

标签: python docker flask gunicorn

我有一个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

我已经浏览了couple上的site答案

据我所知

  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 个答案:

答案 0 :(得分:0)

您运行的Docker容器不正确

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

假设您的Dockerfile正在获取正确的文件,这应该可以解决问题

转到localhost:8080进行验证

答案 1 :(得分:0)

以我的经验,我发现以下方法在处理长颈瓶和长颈瓶时会更有效。我建议您按如下所示在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>"]

希望这会有所帮助。

答案 2 :(得分:0)

我也遇到了这个问题,当然 是我在工具链中的某个地方指定了另一个端口。

仔细检查您的端口!

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"