【问题标题】:SSL Certificate Error for Docker - Flask ApplicationDocker 的 SSL 证书错误 - Flask 应用程序
【发布时间】:2020-05-22 05:15:01
【问题描述】:

部署了一个flask应用并将其绑定到ssl证书以在“https:”上运行,代码如下:

if __name__ == '__main__':
     path = "/usr/local/nginx/ssl/"
     context = (path  + 'abc.crt' , path + 'abc.key')
     app.run_server(debug=True,host='0.0.0.0',ssl_context=context)

现在当我直接通过 python (python scriptname.py) 运行这个脚本时,它工作正常, 但是,当我在 docker 容器中运行时,出现以下错误:

  Exception in thread Thread-2: 
  Traceback (most recent call last):
    File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
     self.run()
    File "/usr/local/lib/python3.6/threading.py", line 864, in run
     self._target(*self._args, **self._kwargs)
    File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 1005, in inner
     fd=fd,
    File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 848, in make_server
     host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd
    File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 766, in __init__
     self.socket = ssl_context.wrap_socket(sock, server_side=True)
    File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 661, in wrap_socket
     **kwargs
    File "/usr/local/lib/python3.6/ssl.py", line 1158, in wrap_socket
     ciphers=ciphers)
    File "/usr/local/lib/python3.6/ssl.py", line 750, in __init__
     self._context.load_cert_chain(certfile, keyfile)

   FileNotFoundError: [Errno 2] No such file or directory

我猜容器正在其他地方搜索文件,这是我的 docker run 命令:

docker run -it --network="host" -p 8050:8050 -v /home/a/b/c:/app abc:1.1

我在这里缺少什么?

编辑:Dockerfile

 FROM python:3.6
 COPY . /app
 WORKDIR /app
 RUN pip3 install -r requirements.txt
 ENTRYPOINT ["python"]
 CMD ["app.py"]

【问题讨论】:

  • 请在此处发布 Dockerfile
  • @MeiramChuzhenbayev 编辑完成。
  • 为什么你有 path=" " 这在 docker 文件中不起作用。因为你的应用在/app
  • @TarunLalwani 路径不是上面提到的空白,我上面没有指定。
  • Docker 容器将只能访问您在其中复制的内容或在运行时映射到其中的内容。所以你有2个选择。一个添加 COPY 语句来复制证书,但是查看当前的 docker 文件,您的证书在 app 文件夹之外,因此没有被复制。因此,您应该在运行容器时使用-v 选项来映射证书。 docker run -it --network="host" -p 8050:8050 -v /home/certs/path:/home/certs/path -v /home/a/b/c:/app abc:1.1

标签: python docker flask plotly-dash


【解决方案1】:

Docker 容器将只能访问您在其中复制的内容或在运行时映射到其中的内容。

所以你有两个选择。第一个选项是添加一个 COPY 语句来复制证书,但是查看当前的 docker 文件,您的证书在 app 文件夹之外,因此没有被复制。

其他选项是使用-v 选项在运行容器时映射证书。

docker run -it --network="host" -p 8050:8050 -v /home/certs/path:/home/certs/path -v /home/a/b/c:/app abc:1.1

但在类似生产的环境中,我建议您不要这样做。您应该使用 nginxuwsgi 并确保您在 nginx 终止 SSL

有关此类选项,请参阅下面的存储库

https://github.com/tiangolo/uwsgi-nginx-flask-docker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多