Рассмотрим этот issue.py
файл:
import subprocess
print('Calling subprocess...')
subprocess.run(['python', '--version'])
print('Subprocess is done!')
Выполнение python issue.py
вручную дает то, что я ожидаю:
Calling subprocess...
Python 3.9.0
Subprocess is done!
Однако, если я выполню это внутри контейнера Docker, произойдет что-то странное:
$ docker run --rm -v $(pwd):/issue python:3.9.0 python /issue/issue.py
Python 3.9.0
Calling subprocess...
Subprocess is done!
Как это исправить, чтобы Docker соблюдал правильный порядок вывода?
Заметки:
- Эта проблема также возникает с
stderr
, хотя приведенный выше MCVE этого не показывает. - MCVE использует образ
python
напрямую, но в моем реальном случае использования у меня есть собственный образ из пользовательского файла Docker, который используетFROM python
. - Использование
capture_output=True
в вызовеsubprocess.run
и последующая печать захваченного вывода для меня не вариант, потому что мой реальный вариант использования вызывает подпроцесс, который со временем выводит информацию вstdout
(в отличие отpython --version
), и я не могу дождаться его завершения, чтобы напечатать весь вывод только после этого.