Docker - 无法获取用户网络摄像头:getUserMedia() 不再适用于不安全的来源
Docker - Can't get user webcam: getUserMedia() no longer works on insecure origins
什么有效
我在 Flask 中创建了一个简单的 Web 应用程序,它负责在 Web 浏览器访问根节点时操作一个简单的 return render_template("index.html")
。
# app.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def show_index():
return render_template("index.html")
if __name__ == "__main__":
app.run(port=80)
index.html 是一个简单的页面,它使用 tracking.js 来获取用户网络摄像头并实时跟踪 his/her 面部视频流。
打开 cmd 并输入 python app.py
结果 Running on http://127.0.0.1:80/
访问上面提到的 URL 会导致页面正确显示,要求我获得使用相机的权限,打开它并在实时视频源中正确跟踪我的脸。所以到这里为止一切正常。
什么不起作用
当我使用 Docker 对我的应用程序进行 docker 化时,我遇到了这个问题。 docker-machine ip
是 192.168.99.100
打开 cmd 并输入:docker run -p 4000:80 my_face_track_app
结果:Running on http://0.0.0.0:80/
访问 192.168.99.100:4000 会导致 index.html
的正确显示,但不再要求我获得相机权限并检查 JS 控制台我读到以下异常:
getUserMedia() no longer works on insecure origins
这里是完整的错误日志:
我知道错误告诉我我没有在 HTTPS 中提供页面。
有没有其他人遇到过这个问题?
问题的正确解决方案或可能的解决方法是什么?
任何帮助将不胜感激,提前非常感谢
我为解决问题所做的努力
由于需要页面的 HTTPS 服务以便 JS 执行函数 getUserMedia()
我努力通过如下修改 app.py 为我的 Flask 应用程序提供 SSL 证书:
# app.py
from flask import Flask, render_template
import OpenSSL
app = Flask(__name__)
@app.route("/")
def show_index():
return render_template("index.html")
if __name__ == "__main__":
app.run(port=80, ssl_context="adhoc")
然后我将应用程序 docker 化以构建新图像。键入:
docker run -p 443:80 facetrackapphttps
结果
Running on https://127.0.0.1:80
是的,这里 HTTPS 已开启:问题是 HTTPS Flask App 的端口 80 映射到 docker-machine ip
192.168.99.100.
的端口 443
尝试访问 192.168.99.100:443 无效,并且未显示任何内容。
有没有人知道如何做到这一点?
如果您的应用程序绑定到容器内的 127.0.0.1
,您将无法从主机访问它。根据flask docs,flask默认绑定到127.0.0.1。
您需要修改您的服务,使其绑定到容器内的 0.0.0.0
:
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, ssl_context="adhoc")
什么有效
我在 Flask 中创建了一个简单的 Web 应用程序,它负责在 Web 浏览器访问根节点时操作一个简单的 return render_template("index.html")
。
# app.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def show_index():
return render_template("index.html")
if __name__ == "__main__":
app.run(port=80)
index.html 是一个简单的页面,它使用 tracking.js 来获取用户网络摄像头并实时跟踪 his/her 面部视频流。
打开 cmd 并输入 python app.py
结果 Running on http://127.0.0.1:80/
访问上面提到的 URL 会导致页面正确显示,要求我获得使用相机的权限,打开它并在实时视频源中正确跟踪我的脸。所以到这里为止一切正常。
什么不起作用
当我使用 Docker 对我的应用程序进行 docker 化时,我遇到了这个问题。 docker-machine ip
是 192.168.99.100
打开 cmd 并输入:docker run -p 4000:80 my_face_track_app
结果:Running on http://0.0.0.0:80/
访问 192.168.99.100:4000 会导致 index.html
的正确显示,但不再要求我获得相机权限并检查 JS 控制台我读到以下异常:
getUserMedia() no longer works on insecure origins
这里是完整的错误日志:
我知道错误告诉我我没有在 HTTPS 中提供页面。
有没有其他人遇到过这个问题? 问题的正确解决方案或可能的解决方法是什么? 任何帮助将不胜感激,提前非常感谢
我为解决问题所做的努力
由于需要页面的 HTTPS 服务以便 JS 执行函数 getUserMedia()
我努力通过如下修改 app.py 为我的 Flask 应用程序提供 SSL 证书:
# app.py
from flask import Flask, render_template
import OpenSSL
app = Flask(__name__)
@app.route("/")
def show_index():
return render_template("index.html")
if __name__ == "__main__":
app.run(port=80, ssl_context="adhoc")
然后我将应用程序 docker 化以构建新图像。键入:
docker run -p 443:80 facetrackapphttps
结果
Running on https://127.0.0.1:80
是的,这里 HTTPS 已开启:问题是 HTTPS Flask App 的端口 80 映射到 docker-machine ip
192.168.99.100.
尝试访问 192.168.99.100:443 无效,并且未显示任何内容。
有没有人知道如何做到这一点?
如果您的应用程序绑定到容器内的 127.0.0.1
,您将无法从主机访问它。根据flask docs,flask默认绑定到127.0.0.1。
您需要修改您的服务,使其绑定到容器内的 0.0.0.0
:
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, ssl_context="adhoc")