Docker - Не удается получить пользовательскую веб-камеру: getUserMedia () больше не работает с незащищенными источниками - PullRequest
0 голосов
/ 14 ноября 2018

ЧТО РАБОТАЕТ

Я создал простое веб-приложение в Flask , которое обеспечивает работу простого return render_template("index.html") при доступе к корневому узлу через вебBrowser.

# 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-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() Я думал об обслуживании моего приложения Flask с помощью SSL-сертификата, изменив app.py следующим образом:

# 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 run -p 443:80 facetrackapphttps

Результат:

 Running on https://127.0.0.1:80

Так что да, здесь HTTPS включен: проблема в том, что порт 80 приложения HTTPS Flask сопоставлен с портом 443docker-machine ip 192.168.99.100.

Попытка доступа 192.168.99.100:443 не работает и ничего не отображается.

У кого-нибудь есть идеи о том, как это сделать?

1 Ответ

0 голосов
/ 14 ноября 2018

Если ваше приложение связано с 127.0.0.1 внутри контейнера, вы не сможете получить к нему доступ со своего хоста.В соответствии с документами о фляге , фляга будет привязана к 127.0.0.1 по умолчанию.

Вам нужно будет изменить свой сервис так, чтобы он связывался с 0.0.0.0 внутри контейнера:

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