【问题标题】:I have a python script running inside a container of kubernetes pod.How do i stop the script which runs along with the starting of the pod?我有一个在 kubernetes pod 容器内运行的 python 脚本。如何停止与 pod 启动一起运行的脚本?
【发布时间】:2021-06-08 06:31:14
【问题描述】:

我在 Kubernetes pod 的容器内运行两个线程,一个线程将一些数据推送到 db,另一个线程(flask 应用程序)显示来自数据库的数据。因此,只要 pod 启动,main.py(启动上述两个线程)就会被调用。

Docker 文件:

FROM python:3

WORKDIR /usr/src/app

COPY app/requirements.txt .

RUN pip install -r requirements.txt

COPY app .

CMD ["python3","./main.py"]

我有两个问题:

  1. 日志是查看运行脚本输出的唯一方法吗?当它在终端上运行时,我们不能连续看到它的输出吗?

  2. 另外,我无法通过进入容器来运行相同的 main.py 文件。它抛出以下错误:


Exception in thread Thread-1:
Traceback (most recent call last):
 File "/usr/local/lib/python3.9/threading.py", line 954, in _bootstrap_inner
  self.run()
 File "/usr/local/lib/python3.9/threading.py", line 892, in run
  self._target(*self._args, **self._kwargs)
 File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 920, in run
  run_simple(t.cast(str, host), port, self, **options)
 File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 1008, in run_simple
  inner()
 File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 948, in inner
  srv = make_server(
 File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 780, in make_server
  return ThreadedWSGIServer(
 File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 686, in __init__
  super().__init__(server_address, handler) # type: ignore
 File "/usr/local/lib/python3.9/socketserver.py", line 452, in __init__
  self.server_bind()
 File "/usr/local/lib/python3.9/http/server.py", line 138, in server_bind
  socketserver.TCPServer.server_bind(self)
 File "/usr/local/lib/python3.9/socketserver.py", line 466, in server_bind
  self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use (edited)

如何停止与 pod 一起启动的 main.py 脚本并能够直接从容器本身运行 main.py?

谢谢。

【问题讨论】:

  • CMD 停止main.py 基本上会停止容器的主进程,因此会杀死容器和pod。也许您想不理会该进程,而是使用不同的端口运行另一个 main.py 实例?

标签: python-3.x docker flask kubernetes python-multithreading


【解决方案1】:

错误信息说明了一切:

OSError: [Errno 98] Address already in use (edited)

您的 python 脚本似乎试图打开同一个端口两次。你不能这样做。检查您的代码并修复它。

现在回答你的另一个问题:

日志是查看运行脚本输出的唯一方法吗?当它在终端上运行时,我们不能连续看到它的输出吗?

运行kubectl logs -f 将遵循日志,这应该让您在终端中运行时连续看到输出。

【讨论】:

  • 一旦 pod 启动,它就会启动容器,然后 main.py 将被调用,由于 api 连接而出现一些错误并且脚本停止。现在,当我尝试进入容器并运行 python3 main.py 时,出现上述错误。如何停止与 pod 创建一起开始的 main.py?我没有在代码中访问同一个端口两次。它在 docker 中完美运行。
  • 有什么方法可以杀死从 pod 开始的 main.py 脚本并从容器中运行 python3 main.py 而不会杀死 pod?
  • 不,您不能交换进程。你确实在容器内访问了同一个端口两次,然后你运行 python3 main.py。一个 main.py 进程已经在运行。当您启动第二个进程时,它会导致错误,因为它会尝试绑定到已被另一个进程保留的端口。
猜你喜欢
  • 1970-01-01
  • 2021-05-07
  • 2021-02-02
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多