{"record":{"id":"466ba8a3f13560a1","repo":"microsoft/autogen","slug":"failed-to-obtain-container-id","errorCode":null,"errorMessage":"Failed to obtain container id.","messagePattern":"Failed to obtain container id\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/packages/autogen-ext/src/autogen_ext/code_executors/docker_jupyter/_jupyter_server.py","lineNumber":384,"sourceCode":"            auto_remove=auto_remove,\n            environment=env,\n            publish_all_ports=True,\n            name=container_name,\n            volumes=volumes,\n            working_dir=str(work_dir),\n        )\n\n        # Wait for container to be ready\n        self._wait_for_ready(container)\n\n        # Store container information\n        self._container = container\n        self._port = int(container.ports[f\"{expose_port}/tcp\"][0][\"HostPort\"])\n        self._container_id = container.id\n        self._expose_port = expose_port\n\n        if self._container_id is None:\n            raise ValueError(\"Failed to obtain container id.\")\n\n        # Define cleanup function\n        def cleanup() -> None:\n            try:\n                assert self._container_id is not None\n                inner_container = client.containers.get(self._container_id)\n                inner_container.stop()\n            except docker.errors.NotFound:\n                pass\n            atexit.unregister(cleanup)\n\n        # Register cleanup if container should be stopped automatically\n        if stop_container:\n            atexit.register(cleanup)\n\n        self._cleanup_func = cleanup\n        self._stop_container = stop_container\n","sourceCodeStart":366,"sourceCodeEnd":402,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/python/packages/autogen-ext/src/autogen_ext/code_executors/docker_jupyter/_jupyter_server.py#L366-L402","documentation":"Defensive check in DockerJupyterServer.__init__ after container creation: container.id came back None from docker-py. In practice this is nearly unreachable (docker-py always populates id on a created container); it guards against SDK/driver anomalies rather than user error.","triggerScenarios":"A docker-py version or Docker API edge case where the container object is returned without an id, e.g. unusual remote Docker drivers, heavily mocked docker clients in tests, or SDK regressions.","commonSituations":"Unit tests that mock docker.from_env()/containers.run with incomplete stub objects; exotic Docker-API-compatible daemons; very old or mismatched docker-py versions against the daemon.","solutions":["Upgrade the docker Python package (pip install -U docker) to match your daemon.","If mocking in tests, make the fake container object return a non-None id and status 'running'.","Verify against real Docker with docker version to rule out driver/daemon anomalies."],"exampleFix":"# before (test stub)\nfake_container.id = None\n\n# after (test stub)\nfake_container.id = \"abc123\"\nfake_container.status = \"running\"","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    server = DockerJupyterServer(...)\nexcept ValueError as e:\n    if \"Failed to obtain container id\" in str(e):\n        raise RuntimeError(\"Docker SDK returned a container without an id; upgrade docker-py\") from e\n    raise","preventionTips":["When mocking docker-py in tests, always populate container.id and status.","Keep the docker Python package in sync with the daemon version."],"tags":["docker","defensive","testing","edge-case"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}