Контейнерные Flask микросервис в Кубернетес - PullRequest
1 голос
/ 20 апреля 2020

Я уже некоторое время работаю над кластером Kubernetes с микросервисами, записанными в Flask, и я не уверен, что мой текущий метод их контейнирования правильный.

Я использовал это изображение в качестве базы.

Но я видел различные посты, в которых говорилось, что что-то подобное может быть немного излишним.

Проблема, с которой я столкнулся, заключается в том, что всякий раз, когда я просматриваю статью об использовании Flask с Kubernetes, они всегда пропускают подробности о реальном контейнере и сосредотачиваются на создании кластера, который у меня уже есть. красивая solid ручка на. Я думаю, что мне интересно, есть ли лучший способ создать изображение docker для одного приложения Flask, потому что трудно найти прямой ответ.

1 Ответ

0 голосов
/ 20 апреля 2020

«лучше» полностью относительный, но вот тот, который я использую.

FROM python:3.7 AS build

ENV PYTHONFAULTHANDLER=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONHASHSEED=random \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100

RUN pip install poetry==1.0.5

WORKDIR /app
COPY poetry.lock pyproject.toml /app/
RUN poetry config virtualenvs.create false && \
    poetry install --no-dev --no-interaction --no-ansi


FROM gcr.io/distroless/python3-debian10

WORKDIR /app
ENV PYTHONPATH=/usr/local/lib/python3.7/site-packages/
COPY --from=build /usr/local/lib/python3.7/site-packages/ /usr/local/lib/python3.7/site-packages/
COPY . /app

CMD ["-m", "myapp"]

С этой точкой входа -m выглядит так:

from . import create_app

application = create_app()


def main() -> None:
    import sys
    from twisted import logger  # type: ignore
    from twisted.internet import reactor  # type: ignore
    from twisted.internet.endpoints import TCP4ServerEndpoint  # type: ignore
    from twisted.python import threadpool  # type: ignore
    from twisted.web.server import Site  # type: ignore
    from twisted.web.wsgi import WSGIResource  # type: ignore
    from prometheus_client.twisted import MetricsResource  # type: ignore

    observers = [logger.textFileLogObserver(sys.stdout)]
    logger.globalLogBeginner.beginLoggingTo(observers)
    logger.Logger().info("myapp starting on :8000")

    pool = threadpool.ThreadPool()
    reactor.callWhenRunning(pool.start)
    django_resource = WSGIResource(reactor, pool, application)
    django_site = Site(django_resource)
    django_endpoint = TCP4ServerEndpoint(reactor, 8000)
    django_endpoint.listen(django_site)
    metrics_resource = MetricsResource()
    metrics_site = Site(metrics_resource)
    metrics_endpoint = TCP4ServerEndpoint(reactor, 9000)
    metrics_endpoint.listen(metrics_site)
    reactor.run()
    pool.stop()


if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...