Docker CLI contexts not used or supported · Issue #3146 · docker/docker-py · GitHub
Skip to content

Docker CLI contexts not used or supported #3146

Closed

Description

@brettdh

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.

Activity

  1. martimors commented on Sep 8, 2023

    @martimors

    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
  2. changed the title [-]docker.from_env() ignores active context[/-] [+]Docker CLI contexts not used or supported[/+] on Nov 21, 2023
  3. pinned this issue on Nov 21, 2023
  4. AstraLuma commented on Nov 30, 2023

    @AstraLuma

    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
        )
    
  5. AstraLuma commented on Nov 30, 2023

    @AstraLuma

    You might be running into #3190?

  6. martimors commented on Dec 1, 2023

    @martimors

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

  7. Khushiyant commented on Jan 4, 2024

    @Khushiyant
    Contributor

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

  8. David234-star commented on Jun 22, 2024

    @David234-star

    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

  9. stefanpejcic commented on Sep 19, 2024

    @stefanpejcic

    I stumbled here searching hot to specify context to docker.from_env()

    Workaround I used is to specify context name, if provided, run command and check the endpoint for that context:

    def get_context_endpoint(context_name):
        try:
            result = subprocess.run(['docker', 'context', 'ls'],
                                    capture_output=True, text=True, check=True)
            
            for line in result.stdout.splitlines()[1:]:
                parts = line.split()
                name = parts[0]
                endpoint = ' '.join(parts[1:])
                
                if name == context_name:
                    return endpoint
        except subprocess.CalledProcessError:
            return None
    

    sepcify that endpoint:

            if docker_context == 'default':
                client = docker.from_env()
            else:
                endpoint = get_context_endpoint(docker_context)
                client = docker.DockerClient(base_url=endpoint)
    
  10. TeaDrinkingProgrammer commented on Jul 1, 2026

    @TeaDrinkingProgrammer

    Can confirm the bug still exists and it is fixed by creating a config.json file (touch ~/.docker/config.json). Could this be reclassed as a bug? This breaks workflows on new systems without config.json

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions