Docker-无法获取用户网络摄像头:getUserMedia()不再适用于不安全的来源

时间:2018-11-14 12:42:41

标签: python docker flask webcam tracking.js

工作原理

我在 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 来获取用户网络摄像头并在实时视频流中跟踪其面部。

打开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

这里是完整的错误日志:

enter image description here

我知道错误告诉我我不在HTTPS中提供该页面。

还有其他人遇到此问题吗? 解决该问题或可能的解决方案的正确解决方案是什么? 任何帮助将不胜感激,在此先谢谢

为了解决该问题我曾尝试做的事情

由于需要页面的HTTPS服务才能使JS执行功能getUserMedia(),因此我想通过使用如下方式修改app.py来使用SSL证书为Flask应用程序提供服务:

# 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无效,并且未显示任何内容。

有人对此有想法吗?

1 个答案:

答案 0 :(得分:2)

如果您的应用程序绑定到容器内的127.0.0.1,则您将无法从主机访问它。根据{{​​3}},烧瓶默认会绑定到127.0.0.1。

您需要修改服务,以使其绑定到容器内的0.0.0.0

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80, ssl_context="adhoc")