Docker, проблема создания и запуска контейнера. Ошибка 409 Ошибка клиента .../exec: Конфликт (контейнер... не запущен)

В Django на этапе разработки я собираю и запускаю Docker-контейнер, используя pool. Я новичок в Docker. Как вы можете видеть, я намеренно не использую оболочку по личным причинам проекта. Код работал правильно до вчерашнего дня, затем после выключения и повторного включения компьютера код не работает сегодня.

ПРОБЛЕМА. Если я правильно понимаю, проблема заключается в том, что я пытаюсь выполнять команды в контейнере, который не запущен, но после попытки различных решений для ожидания, кажется, что ожидание бесполезно.

Ошибка заключается в следующем:

Error creating or running container: 409 Client Error for http+docker://localhost/v1.44/containers/76950z4e1c65fx9hq7f8756db496eb2c0f7870609756g904452231580aa6e596b/exec: Conflict ("container 76950z4e1c65fx9hq7f87 56db496eb2c0f7870609756g904452231580aa6e596b is not running")

АКТУАЛЬНЫЕ РЕШЕНИЯ. Я уже пробовал несколько решений, например, проверять состояние контейнера в цикле (с помощью for или while) и ждать, пока он станет "запущенным", прежде чем приступить к созданию запущенного экземпляра, или без цикла, но с time.sleep или другими подобными типами ожидания). Но это не решает проблему.

ОБСЛЕДОВАНИЕ: Так что проблема не в WAITING, и я не хочу иметь решение, в котором нужно ждать, потому что иначе это означает, что что-то не так. Я также проверил закрытие всех ранее созданных контейнеров в терминале docker rm -f $(docker ps -aq)

Код:

logging.basicConfig(level=logging.DEBUG, handlers=[logging.StreamHandler()])
logger = logging.getLogger(__name__)

# Global Docker client instance
client = docker.from_env()

# Create a queue to manage the container pool
container_pool = Queue()


#Containers Pools
for _ in range(5):
    container = client.containers.create(
        'alpine:latest',
        detach=True, #(to run the container in the background)
        user='nobody:users',
        mem_limit='256m',
        cpuset_cpus='0,5',
        stdin_open=True,
        tty=True,
        entrypoint=['echo'],
        command=[''],
    )
    container_pool.put(container)

@csrf_exempt
def run_code_docker(request, sanitized_code=None):
    if sanitized_code is None:
        sanitized_result = sanitizzazione_sandboxed(request, form_instance=None, Validazione_form_Input=None)
        sanitized_code = sanitized_result['sanitized_values']['formData']

    docker_code = sanitized_code.strip()

    try:
         # Get a container from the pool
         container = container_pool.get()

         # Configure the command in the container
         container.client.api.exec_create(container.id, cmd=['echo', docker_code])

         # Start the container
         container.start()

         # We wait for the container to finish running and get the exit code
         exit_code = container.wait()['StatusCode']

         logs = container.logs() # Decode logs into bytes format

         # Put the container back into the pool
         container_pool.put(container)

         # Check if the code was executed and isolated correctly
         if exit_code == 0:
             return HttpResponse(logs, content_type='text/plain')
         else:
             return HttpResponse(f"Error executing code inside the container. Exit code: {exit_code}", status=500, content_type='text/plain')

     except Exception as e:
         return HttpResponse(f"Error creating or running container: {e}", status=500, content_type='text/plain')
Вернуться на верх