【发布时间】:2019-02-12 13:12:16
【问题描述】:
当我在控制台中运行它时,有一个简单的 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 容器会崩溃以及如何在不崩溃的情况下做到这一点吗?
提前谢谢你!
【问题讨论】:
-
看起来不像是崩溃了。只是看起来它退出了。容器在执行完脚本后退出。
-
@Neil 但是
forever.py不能在没有崩溃的情况下退出。还是可以? -
如果您是
exec-ing 进入运行forever.py的容器,那么您将停止该进程并启动bash -
@C.Nivs 当
exec-ing 进入容器时,日志显示forever.py仍在工作并打印 hello-message 直到我运行mp.py -
嗯好吧。还有一个问题,“docker ps”的输出是什么a)在你的exec进入并运行mp.py之前和b)容器退出之后。
标签: python python-3.x docker docker-compose