Запустите FastAPI внутри док-контейнера

Я развертываю микросервис веб-скрейпинга в контейнере Docker. Я использовал Scrapy и предоставляю вызов API с помощью FastAPI, который выполнит команду сканера.

Я создал контейнер докеров, используя Ubuntu в качестве основы, и установил все необходимые зависимости. Затем я использую «exec container_name bash» в качестве точки входа для запуска команды сервера FastAPI. Но как запустить сервер в фоновом режиме?

Я пытался выполнить сборку из образа докера FastAPI (tiangolo/uvicorn-gunicorn-fastapi:python3.6), но он не запускается.

Вы смотрели документацию по быстрому API о развертывании с помощью докера? fastapi.tiangolo.com/deployment/docker

Craicerjack 10.12.2020 12:36

Когда вы находитесь в bash, вам нужно запустить свой сервер с помощью gunicorn. Поместите свои файлы докеров в свой вопрос, мы не сможем вам помочь без этого

snoob dogg 10.12.2020 12:42

Кроме того, вы упомянули, что существующий образ докера «не запускается». Не могли бы вы написать, как или какую ошибку вы получаете? Возможно, стоит отладить эту часть.

JustLudo 10.12.2020 12:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 012
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я использовал образ 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))

Другие вопросы по теме