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')