gpt4 book ai didi

Python 多处理使 docker 容器崩溃

转载 作者:IT老高 更新时间:2023-10-28 12:45:17 33 4
gpt4 key购买 nike

当我在控制台中运行它时,有一个简单的 python 多处理代码就像一个魅力一样工作:

# mp.py
import multiprocessing as mp


def do_smth():
print('something')


if __name__ == '__main__':
ctx = mp.get_context("spawn")
p = ctx.Process(target=do_smth, args=tuple())
p.start()
p.join()

结果:

> $ python3 mp.py
something

然后我用 Dockerfile 创建了一个简单的 Docker 容器:

FROM python:3.6

ADD . /app
WORKDIR /app

还有 docker-compose.yml:

version: '3.6'

services:
bug:
build:
context: .
environment:
- PYTHONUNBUFFERED=1
command: su -c "python3.6 forever.py"

forever.py 在哪里:

from time import sleep

if __name__ == '__main__':
i = 0
while True:
sleep(1.0)
i += 1
print(f'hello {i:3}')

现在我用 docker compose 运行 forever.py:

> $ docker-compose build && docker-compose up 
...
some output
...
Attaching to mpbug_bug_1
bug_1 | hello 1
bug_1 | hello 2
bug_1 | hello 3
bug_1 | hello 4

到目前为止,一切都很好并且可以理解。但是,当我尝试在 docker 容器中运行 mp.py 时,它会崩溃而没有任何消息:

> $ docker exec -it mpbug_bug_1 /bin/bash
root@09779ec47f9d:/app# python mp.py
something
root@09779ec47f9d:/app# %

可以在此处找到带有代码的要点:https://gist.github.com/ilalex/83649bf21ef50cb74a2df5db01686f18

你能解释一下为什么 docker 容器会崩溃,以及如何在不崩溃的情况下做到这一点吗?

提前谢谢你!

最佳答案

为了快速修复,不要使用 spawn 启动方法,和/或不要使用 su -c ...,两者都是不必要的 IMO。改为:

p = mp.Process(target=do_smth, args=tuple())

或者您可以使用 --init 选项启动容器。

使用 spawn 启动方法,Python 也会启动一个 semaphore tracker process为了防止信号量泄漏,你可以通过在中间暂停 mp.py 来查看这个过程,它看起来像:

472   463 /usr/local/bin/python3 -c from multiprocessing.semaphore_tracker import main;main(3)

这个过程是由mp.py启动的,但在mp.py之后退出,因此不会被mp.py收割,但应该是由 init 设计的。

问题是这个容器(命名空间)中没有 init,而不是 init,PID 1 是 su -c,因此su采用dead semaphore tracker进程。

看来su误认为死子进程是命令进程(forever.py),没有检查关系,所以su 盲目退出,当 PID 1 退出时,内核会杀死容器中的所有其他进程,包括 forever.py

可以通过 strace 观察到这种行为:

docker run --security-opt seccomp:unconfined --rm -it ex_bug strace -e trace=process -f su -c 'python3 forever.py'

会输出如下错误信息:

strace: Exit of unknown pid 14 ignored

引用:Docker and the PID 1 zombie reaping problem (phusion.nl)

关于Python 多处理使 docker 容器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54650904/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com