tqdm внутри потока внутри докера не показывает индикатор выполнения

#python #docker #docker-compose #progress-bar #tqdm

Вопрос:

Из контейнера Docker кажется, что tqdm у него возникли некоторые проблемы с отображением при запуске в собственном потоке.

Я пробовал другие индикаторы выполнения (например alive-progress ), но все они не работают. Тот же код безупречно работает, когда выполняется за пределами контейнера. Это похоже на проблему, связанную с Докером, скорее docker-compose всего, одну, но я не могу определить проблему. Есть какие-нибудь наводки?

Правка: docker run -it console_test работает. Это определенно проблема в конфигурации docker-compose.yml .

Шаги по воспроизведению:

console_test/console.py :

 import threading
import time
import tqdm
import sys

print("Starting the test")


def job():
    for i in tqdm.tqdm(range(50)):
        time.sleep(0.1)
        sys.stdout.flush()  # this has no effect
        # print("Hi")  # this is printed though!
    print("Finished.")


job_thread = threading.Thread(target=job)
job_thread.start()

while 1:
    time.sleep(1)
 

console_test/Dockerfile :

 # Using official python runtime base image
FROM python:3.8.9

RUN pip install tqdm

COPY . .

ENV PYTHONUNBUFFERED=1  # removing this has no effect
ENV PYTHONIOENCODING=UTF-8  # removing this has no effect

ENTRYPOINT ["python", "console.py"]
 

docker-compose.yml :

 version: "3.2"
services:
    console_test:
        build: ./console_test
        stdin_open: true # docker run -i // removing it has no effect
        tty: true        # docker run -t // removing it has no effect
 

И я управляю всем этим вот так:

 docker-compose up --build console_test
 

Во время цикла for панель не отображается. После того, как он завершится и print будет вызван, это результат:

 Attaching to rotonda_console_test_1
console_test_1   | Starting the test
100% 50/50 [00:05<00:00,  9.97it/s]
console_test_1   | Finished.
 

Редактировать

Частичное решение:

После этого я обнаружил, что docker-compose run вместо up того, чтобы, по-видимому, устранить проблему. Хотя понятия не имею, почему.

Комментарии:

1. Вы пробовали бежать напрямую docker run -it ... ? Каков же результат?

2. @eagr Отличная мысль. Это действительно работает! Как я и подозревал, это определенно проблема с составлением докеров. Отредактируйте исходный вопрос с этой детализацией. ИЗМЕНИТЬ: Следуя этому [1], docker-compose run вместо up того, чтобы, похоже, устранить проблему. Понятия не имею, почему. [1]: github.com/tqdm/tqdm/issues/771