docker-py icon indicating copy to clipboard operation
docker-py copied to clipboard

Docker CLI contexts not used or supported

Open brettdh opened this issue 2 years ago • 7 comments

Testing with Docker Desktop on a mac, I have this docker context state:

➜ docker context list
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                                       KUBERNETES ENDPOINT   ORCHESTRATOR
colima              moby                colima                                    unix:///Users/brhiggins/.colima/default/docker.sock
default             moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock
desktop-linux *     moby                                                          unix:///Users/brhiggins/.docker/run/docker.sock

The desktop-linux context is active, and /var/run/docker.sock does not exist. docker version correctly uses the active context and returns the server version info. However, docker.from_env() throws an error:

../../../.pyenv/versions/3.11.4/envs/myproj/lib/python3.11/site-packages/docker/client.py:96: in from_env
    return cls(
../../../.pyenv/versions/3.11.4/envs/myproj/lib/python3.11/site-packages/docker/client.py:45: in __init__
    self.api = APIClient(*args, **kwargs)
../../../.pyenv/versions/3.11.4/envs/myproj/lib/python3.11/site-packages/docker/api/client.py:197: in __init__
    self._version = self._retrieve_server_version()
../../../.pyenv/versions/3.11.4/envs/myproj/lib/python3.11/site-packages/docker/api/client.py:221: in _retrieve_server_version
    raise DockerException(
E   docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))

If I set DOCKER_HOST=unix:///Users/brhiggins/.docker/run/docker.sock in my shell or in Python before calling docker.from_env(), it succeeds.

I'll concede that the name from_env sort of sounds like it only considers environment variables, but I had read it as creating a client from "the current environment" more broadly, and I had expected it to behave the same as the docker CLI.

brettdh avatar Jun 22 '23 15:06 brettdh

Facing the exact issue.

NAME       DESCRIPTION                               DOCKER ENDPOINT                                           ERROR
colima *   colima                                    unix:///Users/dingobar/.colima/default/docker.sock
default    Current DOCKER_HOST based configuration   unix:///var/run/docker.sock

In this scenario I'd expect docker-py to use the Colima context.

My awful workaround is

echo 'export DOCKER_HOST="unix:///Users/dingobar/.colima/default/docker.sock"' >> ~/.zshrc

martimors avatar Sep 08 '23 11:09 martimors

I'm doing this:

def get_client(use: str | None = None) -> docker.DockerClient:
    """
    Get a docker client for the given docker context
    """
    context = docker.ContextAPI.get_context(use)
    if context is None:
        raise ContextNotExistError(f"Docker context {use!r} not found")
    return docker.DockerClient(
        base_url=context.endpoints["docker"]["Host"],
        tls=context.TLSConfig
    )

AstraLuma avatar Nov 30 '23 20:11 AstraLuma

You might be running into #3190?

AstraLuma avatar Nov 30 '23 20:11 AstraLuma

I don't want to write code that selects a specific context, docker-py should know to use the current context.

martimors avatar Dec 01 '23 09:12 martimors

Hey, anyone working on this issue? I have some idea for this issue.

Khushiyant avatar Jan 04 '24 18:01 Khushiyant

The Docker CLI context not used or supported error message means that the Docker CLI cannot find a context that matches the specified name. This can happen for a few reasons:

  • The context does not exist.
  • The context is not accessible to the Docker CLI.
  • The context is not supported by the Docker CLI.

To resolve this error, you can try the following: Check the name of the context and make sure that it is correct. Make sure that the context is accessible to the Docker CLI. You can do this by running the docker context ls command. This will list all of the available contexts. Make sure that the context is supported by the Docker CLI. You can do this by running the docker info command. This will show you the version of the Docker CLI that you are using. If you are still having problems, you can contact Docker support for assistance.

is this correct? guys, I am new to this docker world, so please let me know. everything is AI-generated except me, help me to explore and tackle the open source multiverse

David234-star avatar Jun 22 '24 17:06 David234-star