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
但在类似生产的环境中,我建议您不要这样做。您应该使用 nginx
和 uwsgi
并确保在 nginx
处终止 SSL
有关此类选项的信息,请参阅下面的回购协议
使用以下代码在 "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
但在类似生产的环境中,我建议您不要这样做。您应该使用 nginx
和 uwsgi
并确保在 nginx
有关此类选项的信息,请参阅下面的回购协议