docker容器内的Python,优雅地停止

2024-01-06

我正在运行一个非常基本的 Python 循环示例Windows docker 容器,我愿意优雅地停下来.

该脚本在我的 dockerfile 中以这种方式启动:

CMD [“python.exe”,“./test.py”]

在 docker 文档中说SIGTERM 信号已发送到主命令,所以我试图这样捕捉它:

import signal
import time
import logging, sys

class GracefulKiller:
  kill_now = False
  def __init__(self):
    signal.signal(signal.SIGINT, self.exit_gracefully)
    signal.signal(signal.SIGTERM, self.exit_gracefully)

  def exit_gracefully(self,signum, frame):
    self.kill_now = True

if __name__ == '__main__':
  logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
  killer = GracefulKiller()
  while True:
    time.sleep(1)
    logging.info("doing something in a loop ...")
    if killer.kill_now:
      break

  logging.info("End of the program. I was killed gracefully :)")

理论上,信号应该被处理程序捕获,布尔值应该切换,循环应该退出并显示我的最后一个日志行。事实并非如此,它只是在发出信号时(或者 2-3 秒后)停止整个事情

C:\Users\Administrator\Documents\Projects\test>docker-compose up
Recreating test_1 ... done
Attaching to test_1
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
test_1  | INFO:root:doing something in a loop ...
Gracefully stopping... (press Ctrl+C again to force)
Stopping test_1   ... done

我的最后一行日志从未到达。 有谁知道发生了什么事吗?这是 python 特定问题、docker 特定问题还是 Windows 特定问题?

我还尝试使用 docker 日志检查已停止的容器,最后一个日志也不在这里。尝试在其后添加睡眠,结果相同。

Thanks,


这在使用时似乎仍然普遍存在docker-compose up在当前版本中,我整个早上都在 Raspbian 上进行调查(并引导我来到这里)。

但是运行你的例子docker-compose 2.1.1 via docker-compose up使用以下配置显示您的 python 代码的最后一行实际上被调用,您只是看不到它:

docker-compose.yaml

services:
  grace_test:
    container_name: grace_test
    build: .

Dockerfile

FROM python:3.8-slim-buster

# setup WORKDIR
ADD . /grace_test
WORKDIR /grace_test
CMD ["python", "test.py"]

test.py

import signal
import time
import logging, sys

class GracefulKiller:
  kill_now = False
  def __init__(self):
    signal.signal(signal.SIGINT, self.exit_gracefully)
    signal.signal(signal.SIGTERM, self.exit_gracefully)

  def exit_gracefully(self,signum, frame):
    self.kill_now = True

if __name__ == '__main__':
  logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
  killer = GracefulKiller()
  while True:
    time.sleep(1)
    logging.info("doing something in a loop ...")
    if killer.kill_now:
      break

  logging.info("End of the program. I was killed gracefully :)")

Verify

Use docker-compose logs之后检查日志Ctrl-C:

$ docker-compose logs
grace_test  | INFO:root:doing something in a loop ...
grace_test  | INFO:root:doing something in a loop ...
grace_test  | INFO:root:doing something in a loop ...
grace_test  | INFO:root:doing something in a loop ...
grace_test  | INFO:root:End of the program. I was killed gracefully :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker容器内的Python,优雅地停止 的相关文章

  • 在python中合并3个dict()

    如果多个字典之间有公共字符串 是否有逻辑合并多个字典的方法 即使这些公共字符串在一个 dict 的值与另一个 dict 的键之间匹配 我在 SO 上看到了很多类似的问题 但似乎没有一个问题能解决我将 较低级别文件 中的多个键与较高键 值中的
  • nginx/uwsgi 服务器的持久内存中 Python 对象

    我怀疑这是否可能 但这是问题和提出的解决方案 提出的解决方案的可行性是这个问题的对象 我有一些需要可用于所有请求的 全局数据 我将这些数据保存到 Riak 并使用 Redis 作为缓存层以提高访问速度 目前 数据被分为约 30 个逻辑块 每
  • 如何在 Django Admin 中禁用事务?

    I used transaction non atomic requests for 被超越的save in Person model如下所示 store models py from django db import models fro
  • 在 Tkinter 中调整另一个小部件内的一个小部件的大小

    我正在开发穆斯堡尔光谱 化学 的模拟软件 但在设计 UI 时 我在使用父窗口小部件调整子窗口小部件的大小时遇到 了问题 当窗口最大化时 父框架会填充额外的空间 但子窗口小部件不会更改其大小 from Tkinter import impor
  • numpy 中用最少内存对上三角元素求和的最快方法

    我需要进行此类求和i
  • argparse - 禁用相同参数的出现

    我正在尝试使用 argparse 禁用一个命令行中出现相同的参数 python3 argument1 something argument2 argument1 something else 这意味着这应该会引发错误 因为 argument
  • ImportError:无法导入名称 GstRtspServer,未找到内省类型库

    我目前正在尝试让一个简单的 GstRtspServer 程序在外部亚马逊 Linux EC2 服务器上运行 但在让它实际运行时遇到了严重的问题 无论我做什么 当我尝试运行它时 即使程序仅减少到 import gi gi require ve
  • “您的 APP_BUILD_SCRIPT 指向未知文件:./jni/Android.mk”

    我搜索了整个网络 我认为 不管它说了什么 我尝试过 但仍然没有运气 不工作 我在cygwin和windows下都测试了它这是我的项目文件 目录 D Java 2 workspace indigo JniTest classpath D Ja
  • 禁止docker使用特定网络

    有没有办法告诉 docker 在运行时不要使用某些特定网络docker compose up 我正在使用一些开箱即用的示例 hyperledger 并且每次 docker 获取一个地址都会破坏我的远程连接 xxx xxx fabric do
  • Python 特征向量:numpy.linalg、scipy.linalg 和 scipy.sparse.linalg 之间的差异

    Scipy 和 Numpy 具有三个不同的函数来查找给定方阵的特征向量 它们是 numpy linalg eig a http docs scipy org doc numpy reference generated numpy linal
  • PyGTK TreeView 中的自动换行

    如何在 PyGTK TreeView 中自动换行文本 gtk TreeView 中的文本是使用 gtk CellRendererText 渲染的 文本换行归结为在单元格渲染器上设置正确的属性 为了让文本换行 您需要设置wrap width单
  • iter(fp.readline, '') 中的行而不是 fp 中的行:

    我读了内置函数iter的例子在内置函数 Python 3 7 0 文档 https docs python org 3 library functions html iter with open mydata txt as fp for l
  • 使用 docker-compose 时如何读取外部机密

    我想知道如何将外部秘密传递到 docker compose 生成的服务中 我执行以下操作 我创造新的秘密 printf some secret value goes here docker secret create wallet pass
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • Docker 在 Powershell 中登录 gcr.io

    我正在尝试使用 Windows 10 登录 Google 容器注册表JSON 密钥文件 https cloud google com container registry docs advanced authentication using
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • SQLAlchemy 是否会从同一连接重置 SQLAlchemy 会话之间的数据库会话?

    SQLAlchemy 利用连接池 这意味着相同的连接可以在不同的 SQLAlchemy 会话之间重复使用 但是 单个 SQLAlchemy 会话包含在其自身内并在关闭后被丢弃 然而 连接保持 活动 状态 我想使用 set config 将一
  • 在类方法 Python 中调用多处理

    最初 我有一个类来存储一些处理后的值 并通过其他方法重用这些值 问题是当我尝试将类方法划分为多个进程以加速时 python 生成了进程 但它似乎不起作用 正如我在任务管理器中看到的那样 只有 1 个进程在运行 并且结果从未传递 我做了几次搜
  • 如何更改Python中的全局变量[重复]

    这个问题在这里已经有答案了 我正在尝试更改程序中的变量 我在程序开始时声明了一个全局变量 我想在程序中的不同函数中更改该变量 我可以通过再次声明函数内的变量来做到这一点 但我想知道是否有更好的方法来做到这一点 下面是一些测试代码来解释我的意
  • 在IPython笔记本中自动播放声音

    我经常在 IPython 笔记本中运行长时间运行的单元 我希望笔记本在单元完成执行时自动发出蜂鸣声或播放声音 有没有办法在 iPython 笔记本中执行此操作 或者我可以在单元格末尾放置一些命令来自动播放声音 我正在使用 Chrome 如果

随机推荐

  • 我在 KubernetesPodOperator 的 DAG 设置中做错了什么

    我在这个中找到了以下Airflow DAG博客文章 https kubernetes io blog 2018 06 28 airflow on kubernetes part 1 a different kind of operator
  • Spritekit - 创建一堵“墙”

    我想知道如何用 spritekit 创建一堵墙 物体上的某些东西无法移动过去 我知道我可以使用这段代码 self physicsBody SKPhysicsBody bodyWithEdgeLoopFromRect self frame 但
  • JavaScript 对象检测:点语法与“in”关键字

    我见过两种检测 UA 是否实现特定 JS 属性的方法 if object property and if property in object 我想听听关于哪个更好的意见 最重要的是 为什么 其中一个明显优于另一个吗 除了这两种方法之外还有
  • 获取CPU温度

    我想知道CPU的温度 以下是我使用 C 和 WMI 所做的工作 我正在读取 MSAcpi ThermalZoneTemperature 但它始终相同 而且根本不是 CPU 温度 有没有办法不用写驱动就能获取CPU的真实温度 或者有什么我可以
  • OpenXML SDK C++ 示例

    HI 我正在尝试使用 OpenXML SDK 在 C 中创建一个 Word 文档 我在添加引用和使用命名空间时遇到问题 因为网上的大多数示例都是基于 C 给出的 1 如何在代码中添加对项目的引用并使用命名空间 例如 using namesp
  • 邮政信箱验证

    希望验证邮政信箱 但想知道是否存在此类验证 我将 地址 字段分为 地址 1 和 地址 2 此类 PO Apt Suite 信息所在的位置 Example Address 1 123 Main Street Address 2 Suite 1
  • Hadoop MapReduce 出现“无法解析主机名”错误

    现在我运行Hadoop MapReduce作业 输入数据来自HBase表 最近出现错误 错误如下 错误mapreduce TableInputFormatBase 无法解析 172 16 4 195的主机名 因为javax naming N
  • pandas“未命名”列不断出现

    我遇到一个问题 每次运行程序 从 csv 文件读取数据帧 时 都会显示一个名为 未命名 的新列 运行 3 次后的示例输出列 Unnamed 0 Unnamed 0 1 Subreddit Appearances 这是我的代码 对于每一行 未
  • 将按钮添加到 WinForms 的列表视图中

    有没有办法将按钮控件添加到 WinForms 应用程序中 ListView 内的单元格 这是一个类的代码ListViewExtender您可以重复使用 它不是一个派生类ListView 基本上您只需声明特定列显示为按钮而不是文本 按钮的文本
  • 如何在 Asp.Net Identity 中获取用户的角色名称

    我想弄清楚如何在身份框架中查找用户角色名称 我的配置是 只有一个角色分配给用户 所以 我尝试使用 public string GetUserRole string EmailID string Password var user await
  • 如何释放 glBufferData 内存

    我创建了一个顶点缓冲区对象类来管理应用程序中的大量顶点 用户调用构造函数创建glBuffer 并调用glBufferData分配指定大小的空间 有一个名为 resize 的类函数 允许用户通过再次调用 glBufferData 来更改 VB
  • 在响应式中隐藏图像?

    我是引导程序编码的新手CSS我遇到了一个问题 在桌面版本中我需要一个图像 但当涉及到移动版本时 我需要显示第二个图像 而第一个图像应该隐藏 div class col md 9 style padding 0px img src image
  • iPhone:通过给定的 CGPath 剪辑用户提供的 UIImage

    在我的iPhone应用程序中 我需要让用户剪辑用户提供的UIImage通过给定的动态生成CGPath 所有外部给定的 已关闭 CGPath应该被剪掉 并且生成的图像应该被路径的边界矩形修剪 图像应使用软边框进行裁剪 也就是说 剪切路径边缘的
  • Pygame 鼠标事件中的 Python 时间计数器

    我想计算 Pygame 中用户鼠标事件的时间 如果用户大约 15 秒没有移动鼠标 那么我想在屏幕上显示文本 我试过time模块 但它不起作用 import pygame time pygame init codes font pygame
  • 使用 Azure 函数的动态输出 blob 路径

    我有一个由事件中心触发的 Azure 函数 这是我的 index js 文件的片段 module exports async function context eventHubMessages context log JavaScript
  • Isabelle函数定义实例分析

    想象一下我有一个包含三种情况的函数定义 function f where eq1 if cond1 eq2 if cond2 eq3 if cond3 我怎样才能证明一些方程 f x y f y x 使用左侧的案例分析 仅编写 apply
  • 密钥库和别名 - 是否有使用多个别名?

    使用 Eclipse 导出签名的 Android 应用程序时 使用多个别名是否有目的 根据关于签名的官方指南 http developer android com guide publishing app signing html 建议您使
  • Angular Material Flexbox - 如何在包裹行之间添加边距?

    我正在使用 Angular Material 及其弹性盒功能 我现在遇到了一个在我看来应该很简单的问题 但我却遇到了问题 我已经创建了this https codepen io anon pen grZowkCodepen 用于演示我的问题
  • 开发过程中Meteor自定义mongodb

    我将如何使用 实时运行的 MongoDB 来开发另一个流星应用程序 我尝试修改 meteor server server js 并指定MONGO URL运行前无济于事meteor 这没有使用捆绑的 MongoDB 它必须是一个单独的 自定义
  • docker容器内的Python,优雅地停止

    我正在运行一个非常基本的 Python 循环示例Windows docker 容器 我愿意优雅地停下来 该脚本在我的 dockerfile 中以这种方式启动 CMD python exe test py 在 docker 文档中说SIGTE