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