【问题标题】:How to stop a specific docker container using Python如何使用 Python 停止特定的 docker 容器
【发布时间】:2019-07-11 20:58:54
【问题描述】:

我有一个 Docker 组合文件,它启动一个数据库、网络服务器和一个工作器。我们的用户可能需要运行额外的工作人员,而我正在工作(使用“...up --scale worker=x”)。用户可能还想停止特定的工作人员。这就是我遇到麻烦的地方。在命令行上,我可以使用“docker stop worker_name”,这可以正常工作,但当我使用子进程从 Python 调用它时就不行了。我已经看到使用 docker-compose stop 的参考,但是 docker-compose 不是通过您的 yml 文件进行的吗?你怎么能用它来停止一个容器?我们在 Ubuntu 18.04 上使用 Python 3.7.1。 Docker 版本是 18.06。

这是一个来自 Python 的用于停止 worker 的 sn-p。

kwargs - { 'shell': True,
   'stdout': subprocess.PIPE,
   'stderr': subprocess.PIPE,
   'universal_newlines': True
   }
worker_name = 'worker_1'
cmd = f'docker stop {worker_name}'
proc = subprocess.Popen(cmd, **kwargs)
out, err = proc.communicate()
self.logger.info(f'out = {out}')
self.logger.info(f'err = {err}')

【问题讨论】:

  • 为什么不分享你的python代码呢?没有理由 bash command 有效,但 python subprocess 调用此命令无效。
  • @atline 查看我的补充。

标签: python docker


【解决方案1】:

在黑暗中拍摄:

当你在命令行中使用docker stop时,容器是立即停止还是有明显的延迟?(*)如果后者,在容器中,worker是由脚本启动而不使用exec ?如果是这种情况,SIGTERM/SIGINT 将被发送到容器主进程,即脚本,由于控制权在核心工作代码中,因此无法对其进行任何操作。

正确地说,starter 脚本应该exec 核心worker 代码,这样worker 就成为容器的主进程(或者更准确地说,容器的主进程成为worker 代码)。 SIGINT/SIGTERM 将由该进程处理,容器将及时停止。

(*) 当您执行 docker stop 时,容器会收到一个 SIGINT(或者是一个 SIGTERM);如果它没有及时终止(10 秒 IIRC),那么它会被给予带有 SIGKILL 的斧头。

【讨论】:

  • 停止大约需要 5-8 秒。我们的工作人员正在运行 celery,因此 worker.docker 文件使用以下内容:CMD celery worker --app=myapp --loglevel=info --concurrency=1 -Q myplugin -n myplugin-$HOSTNAME。我认为我们没有使用 exec。
  • 看起来像code is properly exec'ed,很遗憾。
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2018-09-05
相关资源
最近更新 更多