Я развертываю микросервис веб-скрейпинга в контейнере Docker. Я использовал Scrapy и предоставляю вызов API с помощью FastAPI, который выполнит команду сканера.
Я создал контейнер докеров, используя Ubuntu в качестве основы, и установил все необходимые зависимости. Затем я использую «exec container_name bash» в качестве точки входа для запуска команды сервера FastAPI. Но как запустить сервер в фоновом режиме?
Я пытался выполнить сборку из образа докера FastAPI (tiangolo/uvicorn-gunicorn-fastapi:python3.6), но он не запускается.
Когда вы находитесь в bash, вам нужно запустить свой сервер с помощью gunicorn. Поместите свои файлы докеров в свой вопрос, мы не сможем вам помочь без этого
Кроме того, вы упомянули, что существующий образ докера «не запускается». Не могли бы вы написать, как или какую ошибку вы получаете? Возможно, стоит отладить эту часть.
Я использовал образ tiangolo/uvicorn-gunicorn-fastapi:python3.6 и установил туда свои зависимости для парсинга веб-страниц вместе с переменными среды и изменил рабочий каталог на папку, из которой можно выполнить команду scrapy crawl mybot
.
Проблема, с которой я столкнулся при использовании этого решения ранее, — это тайм-аут ответа, потому что я запускаю указанную выше команду scrapy crawl mybot
как процесс ОС, используя os.popen('scrapy crawl mybot')
внутри функции API, регистрируя выходные данные, а затем возвращая ответ. Я знаю, что это неправильный путь - я попробую запустить его как фоновую работу; но пока это обходной путь.
Докерфайл:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.6
# Install dependencies:
COPY requirements.txt .
RUN pip3 install -r requirements.txt
ENV POSTGRESQL_HOST=localhost
ENV POSTGRESQL_PORT=5432
ENV POSTGRESQL_DB=pg
ENV POSTGRESQL_USER=pg
ENV POSTGRESQL_PWD=pwd
ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8
COPY ./app /app
WORKDIR "/app"
Конечная точка FastAPI:
@app.get("/scraper/crawlWeb")
async def scrapy_crawl_web(bot_name):
current_time = datetime.datetime.now()
start = current_time.timestamp()
print("--START JOB at " + str(current_time))
stream = os.popen(
'scrapy crawl %s 2>&1 & echo "$! `date`" >> ./scrapy_pid.txt' % bot_name)
output = stream.read()
print(output)
current_time = datetime.datetime.now()
end = current_time.timestamp()
print("--END JOB at " + str(current_time))
return "Crawler job took %s minutes and closed at %s" % ((end-start)/60.00, str(current_time))
Вы смотрели документацию по быстрому API о развертывании с помощью докера? fastapi.tiangolo.com/deployment/docker