背景
我有一个运行在桌面PC上的大型Python服务,我需要将它作为K8S部署的一部分来运行。我预计,在服务开始工作之前,我需要进行几个小的更改,才能使服务在部署/吊舱中运行。
问题
到目前为止,如果我在Python代码中遇到问题,需要一段时间来更新代码,并将其部署到另一轮测试中。例如,我必须:
docker load
图像,更新标签,并将其推送到注册表后端DB.每次我需要调试一个小问题时,这都需要大量的准备时间。理想情况下,我更希望能够修改已经在荚上运行的Python代码的副本,但我不能杀死它(因为Python服务是使用PID=1
启动的默认应用程序),而且K8S不支持重新启动一个pod (据我所知)。或者,如果我杀死/启动另一个结束符,它将不会发生我以前所做的本地更改(当然,这是设计上的,但无助于我的调试工作)。
问题
是否有更好/更快的方法来快速地将(实验性/调试)更改部署到我正在测试的容器中,而无需花费几分钟重新创建容器映像、重新部署/标记/推送它们等等?如果我能够找到并挂载(读-写) Docker映像,这可能会有所帮助,因为我可以直接编辑其中的数据(即新的Python更改),并且只需删除pods,这样部署就可以重新创建它们。
发布于 2019-04-26 19:30:14
主要有两种选择:一种是使用减少或自动化流的工具,另一种是使用Minikube之类的工具在本地开发。
首先,有100万零1种工具,但Skaffold可能是最常见的工具。
对于第二个步骤,您可以执行类似于( eval $(minikube docker-env) && docker build -t myimagename . )
的操作,它将直接在Minikube环境中构建映像,因此您可以完全跳过列表中的步骤3和步骤4。您可以将其与检测映像更改的工具结合使用,该工具可以重新启动豆荚,也可以更新部署(重新启动吊舱)。
另外,使用scp
和docker load
的FWIW是非常不标准的,通常这会被合并成docker push
。
发布于 2019-04-27 01:15:58
我认为您的痛处在于依赖于python代码的容器。您可以找到一种方法将源代码从坞映像生成阶段中排除出来。
根据我的经验,我将创建一个只包含python包依赖项的docker映像,并使用volume
将源代码dir映射到容器路径,因此如果没有添加或删除依赖项,则不需要重新构建图像。
示例
我对k8s没有太多的经验,但我相信它肯定和docker run
差不多。
Dockerfile
FROM python:3.7-stretch
COPY ./python/requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
ENTRYPOINT ["bash"]
码头集装箱
scp
将代码部署到服务器,并将主机源路径映射到容器源路径,如下所示:
docker run -it -d -v /path/to/your/python/source:/path/to/your/server/source --name python-service your-image-name
使用卷映射,您的容器不再依赖于源代码,您可以轻松地更改源代码,而无需重新生成映像。
https://stackoverflow.com/questions/55873256
复制相似问题