Docker 的 SSL 证书错误 - Flask 应用程序

SSL Certificate Error for Docker - Flask Application

使用以下代码在 "https:" 上部署了一个 flask 应用程序并将其绑定到 运行 的 ssl 证书:

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 运行 命令:

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"]

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