【问题标题】:Start docker with flask application using ssl [duplicate]使用 ssl 使用烧瓶应用程序启动 docker [重复]
【发布时间】:2018-07-23 18:44:57
【问题描述】:

我有一个带有 SSL 授权的烧瓶应用程序。 这是我的 run.py:

#!flask/bin/python
from app import app
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
ctx.load_cert_chain('sertnew/se-emulator.crt', 'sertnew/se-emulator.key')
app.run(debug=True, host='127.0.0.1', port=5000, ssl_context=ctx)

在我的机器上,我简单地运行它 python run.py 然后我在 chrome 中打开 https://localhost:5000 并且它可以工作(有非安全连接的消息,但对我来说没关系)

现在我正试图让它在 Docker 容器中工作。 我有一个像这样的 Dockerfile:

FROM python:3.5-slim
RUN apt-get update && apt-get install -y python3-pip
COPY . /storage-emulator
WORKDIR /storage-emulator
RUN pip3 install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["run.py"]

并尝试以不同的方式运行它。 我可以看到“Running on https://127.0.0.1:5000/(按 CTRL+C 退出)”消息,但无法在浏览器中打开该页面。我做错了什么?

【问题讨论】:

  • 您能否进一步扩展“无法在浏览器中打开页面”?浏览器显示的错误是什么?
  • 运行 docker 镜像的命令是什么?
  • 我用 docker run -itp 5000:5000 my_app 运行它
  • 在浏览器中我看到无法访问此站点localhost unexpectedly closed the connection. ERR_CONNECTION_CLOSED
  • 我还有一个 python 脚本发布数据,它也使用 SSL,当我在没有 docker 的情况下运行应用程序时它工作正常。使用 docker 我收到错误 requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=5000): Max retries exceeded with url: /post_data (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:748)'),))

标签: python docker ssl flask


【解决方案1】:

这是一个相当简单的修复,你必须改变这一行:

app.run(debug=True, host='127.0.0.1', port=5000, ssl_context=ctx)

app.run(debug=True, host='0.0.0.0', port=5000, ssl_context=ctx)

你得从容器的角度去想:容器有自己的“localhost”,和宿主机的localhost不同,这都意味着flask从来没有收到过请求。

因此,您可以简单地绑定到容器内的所有 IP,这是通过绑定到“0.0.0.0”来完成的。

【讨论】:

  • 几乎正确。我改了:app.run(debug=True, host='0.0.0.0', port=443, ssl_context=ctx) 端口需要是 443(我不记得为什么)。在 Dockerfile 中暴露 443 端口并使用 docker run -itp 10443:443 my_app 运行它,它可以工作
  • @JuliaAlexandrova 这可能是因为 浏览器 需要通过标准端口(即 443)进行 SSL 连接。
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2017-10-18
相关资源
最近更新 更多