docker - 在 K8S pod 中快速修改 Python 应用进行调试
问题描述
背景
我有一个在桌面 PC 上运行的大型 Python 服务,我需要让它作为 K8S 部署的一部分运行。我希望我必须进行一些小的更改才能使服务在部署/pod 中运行,然后才能正常工作。
问题
到目前为止,如果我在 Python 代码中遇到问题,需要一段时间来更新代码,并将其部署以进行另一轮测试。例如,我必须:
- 修改我的 Python 代码。
- 重建 Docker 容器(包括我的 Python 服务)。
scp
将 Docker 容器转移到 Docker Registry 服务器。docker load
图像,更新标签,并将其推送到注册表后端数据库。- 手动终止当前运行的 pod,以便部署使用新的 Docker 映像重新启动所有 pod。
每次我需要调试一个小问题时,这都会涉及大量的前置时间。理想情况下,我更喜欢能够只修改已经在 pod 上运行的 Python 代码的副本,但我不能杀死它(因为 Python 服务是启动的默认应用程序,使用PID=1
),而 K8S 没有t 支持重新启动 pod(据我所知)。或者,如果我杀死/启动另一个 pod,它不会对我之前正在处理的 pod 进行本地更改(当然,这是设计使然;但对我的调试工作没有帮助)。
问题
有没有更好/更快的方法来快速部署(实验/调试)更改到我正在测试的容器,而无需花费几分钟重新创建容器映像、重新部署/标记/推送它们等?如果我可以找到并挂载(读写)Docker 映像,那可能会有所帮助,因为我可以直接编辑其中的数据(即新的 Python 更改),然后杀死 pod,以便部署重新创建它们。
解决方案
有两个主要选择:一个是使用减少或自动化该流程的工具,另一个是使用 Minikube 之类的本地开发。
首先,有一百万种工具,但 Skaffold 可能是最常见的一种。
其次,您执行类似的操作( eval $(minikube docker-env) && docker build -t myimagename . )
,将直接在 Minikube docker 环境中构建映像,这样您就可以完全跳过列表中的步骤 3 和 4。您可以将其与检测映像更改并重新启动您的 pod 或更新部署(重新启动 pod)的工具结合使用。
FWIW 使用scp
anddocker load
也非常不标准,通常会组合成docker push
.
推荐阅读
- java - Feign + Wiremock:连接被拒绝:没有更多信息执行 GET
- c# - 如何将函数的结果作为另一个函数的输入
- apache - 通配符子域未使用正确的 conf 文件
- llvm - 将所有代码(包括依赖项)编译为 LLVM IR
- pipenv - python pipenv:如何定义 Pipfile 文件夹位置
- node.js - Nestjs 是否支持同时在操作上获取和发布?
- docker - Docker:数据库、客户端和 API 之间的分离级别
- laravel - 如何在 laravel 的查询生成器中使用 with
- css - 如何使用 w3.css 制作全角和响应式表格
- python - Raspberry Pi Reboot 时运行 Python3 Web 服务器程序