Python 在Kubernetes将烧瓶微型服务集装箱化

Python 在Kubernetes将烧瓶微型服务集装箱化,python,docker,flask,kubernetes,microservices,Python,Docker,Flask,Kubernetes,Microservices,我已经在Kubernetes集群上使用Flask中编写的微服务工作了一段时间,我不确定当前的容器化方法是否正确 我一直使用图像作为基础 但我看到很多帖子都说这样做可能有点过头了 我遇到的问题是,每当我查找一篇关于将Flask与Kubernetes一起使用的文章时,他们总是跳过实际容器的细节,并将重点放在构建集群上,这一点我已经有了一个非常可靠的处理方法。我想我想知道的是,是否有更好的方法为单个Flask应用程序构建docker图像,因为很难找到一个直接的答案。“更好”完全是相对的,但这里是我使用

我已经在
Kubernetes
集群上使用
Flask
中编写的微服务工作了一段时间,我不确定当前的容器化方法是否正确

我一直使用图像作为基础

但我看到很多帖子都说这样做可能有点过头了

我遇到的问题是,每当我查找一篇关于将
Flask
Kubernetes
一起使用的文章时,他们总是跳过实际容器的细节,并将重点放在构建集群上,这一点我已经有了一个非常可靠的处理方法。我想我想知道的是,是否有更好的方法为单个
Flask
应用程序构建docker图像,因为很难找到一个直接的答案。

“更好”完全是相对的,但这里是我使用的方法

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()

我明白你的意思,你认为你的docker图像创建方法可能是错误的

打造docker形象的主要理念。映像应该只有您的依赖项。正如你们所说的,要找到答案很难,因为我们不知道你们的要求,也许你们的dockerfile是唯一的方法

我建议你阅读这份文件。 我读了这篇文档,我的docker图像真的得到了改进。我想这会对你有帮助

当我检查你的dockerfile;我只注意到,我想和你分享

第五行不应该这样表演。dockerfile不应该经常更新,每个依赖项都应该进行版本控制

我就是这样塑造这个形象的

我使用版本将所有依赖项写入req.txt

req.txt

flask==1.1.1
Dockerfile

+ COPY req.txt .
+ RUN pip install -r req.txt
我还想在bash脚本中执行第5行到第28行

重要信息;我的经理不希望在Dockerfile中出现评论行。她想在读的时候明白。她想要简单易读的docker文件。:)她是一个更聪明的人。您应该保持dockerfile的简单,并且应该理解它,不带任何注释行


谢谢你的回答!你能提供更多关于这里发生的事情的细节吗?在什么背景下?这是一个dockerfile和一个使用Twisted的基于线程的web服务器。试试看它是否能在您的项目中帮助您