Существует простой многопроцессорный код 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
Затем я создал простой Docker-контейнер с Dockerfile:
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}')
Теперь я запускаю forever.py
с помощью docker compose:
> $ 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
До этого момента все хорошо и понятно. Но когда я пытаюсь запустить mp.py
в контейнере mp.py
он вылетает без какого-либо сообщения:
> $ docker exec -it mpbug_bug_1 /bin/bash
[email protected]:/app# python mp.py
something
[email protected]:/app# %
Суть кода можно найти здесь: https://gist.github.com/ilalex/83649bf21ef50cb74a2df5db01686f18
Можете ли вы объяснить, почему разбился контейнер Docker и как это сделать без сбоев?
Заранее спасибо!