【发布时间】:2019-01-05 03:55:15
【问题描述】:
我正在编写一个 Flask API,它调用执行 Selenium Web 抓取脚本的 docker 容器。我已经在 dev 中对此进行了测试,它工作正常(python3 -m run flask host=0.0.0.0)并且我确保用户(ubuntu)在 docker 组中并且该组已被重置(newgrp docker)但是它尝试运行时仍然出现权限错误。我已经检查了 PID 并且用户是 gunicorn 进程的 ubuntu,图像在 docker 中可用,还需要什么来提供权限?我的烧瓶代码如下
import docker
import os
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/civitek/<f_name>/<l_name>/<ref_url>')
def civitek(f_name, l_name, ref_url):
client = docker.from_env()
container = client.containers.create('qxf2rohand/qxf2_pom_essentials',command="/bin/bash", environment=["F_NAME={}".format(f_name), "L_NAME={}".format(l_name),"REF_URL={}".format(ref_url)], volumes={os.path.join(os.getcwd(),'florida'):{'bind':'/florida','mode':'rw'}}, stdin_open=True, auto_remove=False)
container.start()
container.exec_run('pip install pytz selenium pillow captcha2upload pyvirtualdisplay requests')
container.exec_run('python florida/civitek_scraper.py')
civi = open(str(os.path.join(os.getcwd(),'florida/output/output.html')))
output = civi.read()
container.stop()
container.remove()
return output
@app.route('/indiana/<ref_url>')
def indiana(ref_url):
client = docker.from_env()
container = client.containers.create('qxf2rohand/qxf2_pom_essentials',command="/bin/bash", environment=["REF_URL={}".format(ref_url)], volumes={os.path.join(os.getcwd(),'indiana'):{'bind':'/indiana','mode':'rw'}}, stdin_open=True, auto_remove=False)
container.start()
container.exec_run('pip install pytz selenium bs4 pyvirtualdisplay requests')
container.exec_run('python indiana/in_scraper.py')
indy = open(str(os.path.join(os.getcwd(),'indiana/output/output.html')))
output = indy.read()
container.stop()
container.remove()
return render_template('in_master_template.html', results=output)
if __name__ == '__main__':
app.run()
【问题讨论】: