Ejemplo n.º 1
0
 def __init__(self,
              cmd_prefix=None,
              default_bin=None,
              base_url=None,
              tls=None,
              use_sudo=None,
              debug=None):
     super(DockerCliClient, self).__init__()
     base_url = base_url or env.get('docker_base_url')
     if base_url:
         cmd_args = ['-H {0}'.format(base_url)]
     else:
         cmd_args = []
     if tls or (tls is None and env.get('docker_tls')):
         cmd_args.append('--tls')
     self._out = DockerCommandLineOutput(
         cmd_prefix or env.get('docker_cli_prefix'), default_bin
         or env.get('docker_cli_bin', 'docker'), cmd_args or None)
     if use_sudo or (use_sudo is None and env.get('docker_cli_sudo')):
         self._call_method = sudo
     else:
         self._call_method = run
     self._quiet = not (debug or
                        (debug is None and env.get('docker_cli_debug')))
     self.api_version = None
     self._update_api_version()
Ejemplo n.º 2
0
 def __init__(self, cmd_prefix=None, default_bin='docker', base_url=None, tls=None, use_sudo=False):
     super(DockerCliClient, self).__init__()
     if base_url:
         cmd_args = ['-H {0}'.format(base_url)]
     else:
         cmd_args = []
     if tls:
         cmd_args.append('--tls')
     self._out = DockerCommandLineOutput(cmd_prefix, default_bin, cmd_args or None)
     if use_sudo:
         self._call_method = sudo
     else:
         self._call_method = run
Ejemplo n.º 3
0
 def __init__(self, cmd_prefix=None, default_bin=None, base_url=None, tls=None, use_sudo=None, debug=None):
     super(DockerCliClient, self).__init__()
     base_url = base_url or env.get('docker_base_url')
     if base_url:
         cmd_args = ['-H {0}'.format(base_url)]
     else:
         cmd_args = []
     if tls or (tls is None and env.get('docker_tls')):
         cmd_args.append('--tls')
     self._out = DockerCommandLineOutput(cmd_prefix or env.get('docker_cli_prefix'),
                                         default_bin or env.get('docker_cli_bin', 'docker'), cmd_args or None)
     if use_sudo or (use_sudo is None and env.get('docker_cli_sudo')):
         self._call_method = sudo
     else:
         self._call_method = run
     self._quiet = not (debug or (debug is None and env.get('docker_cli_debug')))
     self.api_version = None
     self._update_api_version()
Ejemplo n.º 4
0
class DockerCliClient(DockerUtilityMixin):
    """
    Docker client for Fabric using the command line interface on a remote host.

    :param cmd_prefix: Custom prefix to prepend to the Docker command line.
    :type cmd_prefix: unicode
    :param default_bin: Docker binary to use. If not set, uses ``docker``.
    :type default_bin: unicode
    :param base_url: URL to connect to; if not set, will refer to ``env.docker_base_url`` or use ``None``, which by
     default attempts a connection on a Unix socket at ``/var/run/docker.sock``.
    :type base_url: unicode
    :param tls: Whether to use TLS on the connection to the Docker service.
    :type tls: bool
    :param use_sudo: Whether to use ``sudo`` when performing Docker commands.
    :type use_sudo: bool
    :param debug: If set to ``True``, echoes each command and its console output. Some commands are echoed either way
     for some feedback.
    :type debug: bool
    """
    def __init__(self,
                 cmd_prefix=None,
                 default_bin=None,
                 base_url=None,
                 tls=None,
                 use_sudo=None,
                 debug=None):
        super(DockerCliClient, self).__init__()
        base_url = base_url or env.get('docker_base_url')
        if base_url:
            cmd_args = ['-H {0}'.format(base_url)]
        else:
            cmd_args = []
        if tls or (tls is None and env.get('docker_tls')):
            cmd_args.append('--tls')
        self._out = DockerCommandLineOutput(
            cmd_prefix or env.get('docker_cli_prefix'), default_bin
            or env.get('docker_cli_bin', 'docker'), cmd_args or None)
        if use_sudo or (use_sudo is None and env.get('docker_cli_sudo')):
            self._call_method = sudo
        else:
            self._call_method = run
        self._quiet = not (debug or
                           (debug is None and env.get('docker_cli_debug')))
        self.api_version = None
        self._update_api_version()

    def _call(self, cmd, quiet=False):
        if cmd:
            return self._call_method(cmd,
                                     shell=False,
                                     quiet=quiet and self._quiet)
        return None

    def create_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_container', *args, **kwargs)
        return {'Id': self._call(cmd_str)}

    def start(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('start', *args, **kwargs)
        self._call(cmd_str)

    def restart(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('restart', *args, **kwargs)
        self._call(cmd_str)

    def stop(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('stop', *args, **kwargs)
        self._call(cmd_str)

    def remove_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_container', *args, **kwargs)
        self._call(cmd_str)

    def remove_image(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_image', *args, **kwargs)
        self._call(cmd_str)

    def kill(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('kill', *args, **kwargs)
        self._call(cmd_str)

    def wait(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('wait', *args, **kwargs)
        self._call(cmd_str)

    def containers(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('containers', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_containers_output(res)

    def inspect_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_container', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res, 'container')

    def images(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('images', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_images_output(res)

    def pull(self, repository, tag=None, **kwargs):
        repo_tag = '{0}:{1}'.format(repository, tag) if tag else repository
        cmd_str = self._out.get_cmd('pull', repo_tag, **kwargs)
        self._call(cmd_str)

    def push(self, repository, tag=None, **kwargs):
        repo_tag = '{0}:{1}'.format(repository, tag) if tag else repository
        cmd_str = self._out.get_cmd('push', repo_tag, **kwargs)
        self._call(cmd_str)

    def create_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_network', *args, **kwargs)
        return {'Id': self._call(cmd_str)}

    def remove_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_network', *args, **kwargs)
        self._call(cmd_str)

    def connect_container_to_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('connect_container_to_network', *args,
                                    **kwargs)
        self._call(cmd_str)

    def disconnect_container_from_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('disconnect_container_from_network', *args,
                                    **kwargs)
        self._call(cmd_str)

    def networks(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('networks', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_networks_output(res)

    def inspect_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_network', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res, 'network')

    def create_volume(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_volume', *args, **kwargs)
        return {'Name': self._call(cmd_str)}

    def remove_volume(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_volume', *args, **kwargs)
        self._call(cmd_str)

    def volumes(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('volumes', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return {'Volumes': parse_volumes_output(res), 'Warnings': None}

    def inspect_volume(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_volume', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res, 'volume')

    def exec_create(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('exec_create', *args, **kwargs)
        self._call(cmd_str)

    def exec_start(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('exec_start', *args, **kwargs)
        self._call(cmd_str)

    def top(self, container, ps_args):
        if ps_args:
            cmd_str = self._out.get_cmd('top', container, ps_args)
        else:
            cmd_str = self._out.get_cmd('top', container)
        res = self._call(cmd_str, quiet=True)
        return parse_top_output(res)

    def tag(self, image, repository, tag=None, **kwargs):
        if tag:
            repo_tag = '{0}:{1}'.format(repository, tag)
        else:
            repo_tag = repository
        cmd_str = self._out.get_cmd('tag', image, repo_tag, **kwargs)
        return self._call(cmd_str)

    def logs(self, *args, **kwargs):
        kwargs.pop('stream', None)
        cmd_str = self._out.get_cmd('logs', *args, **kwargs)
        return self._call(cmd_str, quiet=True)

    def login(self, **kwargs):
        for key, variable in [('username', 'user'), ('password', 'password'),
                              ('email', 'mail'), ('registry', 'repository'),
                              ('insecure_registry', 'insecure')]:
            if key not in kwargs:
                env_value = env.get('docker_registry_{0}'.format(variable))
                if env_value:
                    kwargs[key] = env_value
        registry = kwargs.pop('registry',
                              env.get('docker_registry_repository'))
        if registry:
            cmd_str = self._out.get_cmd('login', registry, **kwargs)
        else:
            cmd_str = self._out.get_cmd('login', **kwargs)
        res = self._call(cmd_str, quiet=True)
        lines = res.splitlines()
        fastprint(lines)
        return 'Login Succeeded' in lines

    def build(self,
              tag,
              add_latest_tag=False,
              add_tags=None,
              raise_on_error=True,
              **kwargs):
        try:
            context = kwargs.pop('fileobj')
        except KeyError:
            raise ValueError(
                "'fileobj' needs to be provided. Using 'path' is currently not implemented."
            )
        for a in ['custom_context', 'encoding']:
            kwargs.pop(a, None)

        with temp_dir() as remote_tmp:
            remote_fn = posixpath.join(remote_tmp, 'context')
            put(context, remote_fn)
            cmd_str = self._out.get_cmd('build',
                                        '- <',
                                        remote_fn,
                                        tag=tag,
                                        **kwargs)
            with settings(warn_only=not raise_on_error):
                res = self._call(cmd_str)
        if res:
            image_id = _find_image_id(res)
            if image_id:
                self.add_extra_tags(image_id, tag, add_tags, add_latest_tag)
                return image_id
        return None

    def version(self, **kwargs):
        kwargs.pop('api_version', None)
        cmd_str = self._out.get_cmd('version')
        res = self._call(cmd_str, quiet=True)
        version_dict = parse_version_output(res)
        return version_dict

    def push_log(self, info, level, *args, **kwargs):
        pass

    def _update_api_version(self):
        if self.api_version and self.api_version != 'auto':
            return
        version_dict = self.version()
        if 'APIVersion' in version_dict:
            self.api_version = version_dict['APIVersion']
        elif 'ApiVersion' in version_dict:
            self.api_version = version_dict['ApiVersion']

    def run_cmd(self, command):
        sudo(command)
Ejemplo n.º 5
0
class DockerCliClient(DockerUtilityMixin):
    """
    Docker client for Fabric using the command line interface on a remote host.

    :param cmd_prefix: Custom prefix to prepend to the Docker command line.
    :type cmd_prefix: unicode
    :param default_bin: Docker binary to use. If not set, uses ``docker``.
    :type default_bin: unicode
    :param base_url: URL to connect to; if not set, will refer to ``env.docker_base_url`` or use ``None``, which by
     default attempts a connection on a Unix socket at ``/var/run/docker.sock``.
    :type base_url: unicode
    :param tls: Whether to use TLS on the connection to the Docker service.
    :type tls: bool
    :param use_sudo: Whether to use ``sudo`` when performing Docker commands.
    :type use_sudo: bool
    :param debug: If set to ``True``, echoes each command and its console output. Some commands are echoed either way
     for some feedback.
    :type debug: bool
    """
    def __init__(self, cmd_prefix=None, default_bin=None, base_url=None, tls=None, use_sudo=None, debug=None):
        super(DockerCliClient, self).__init__()
        base_url = base_url or env.get('docker_base_url')
        if base_url:
            cmd_args = ['-H {0}'.format(base_url)]
        else:
            cmd_args = []
        if tls or (tls is None and env.get('docker_tls')):
            cmd_args.append('--tls')
        self._out = DockerCommandLineOutput(cmd_prefix or env.get('docker_cli_prefix'),
                                            default_bin or env.get('docker_cli_bin', 'docker'), cmd_args or None)
        if use_sudo or (use_sudo is None and env.get('docker_cli_sudo')):
            self._call_method = sudo
        else:
            self._call_method = run
        self._quiet = not (debug or (debug is None and env.get('docker_cli_debug')))
        self.api_version = None
        self._update_api_version()

    def _call(self, cmd, quiet=False):
        if cmd:
            return self._call_method(cmd, shell=False, quiet=quiet and self._quiet)
        return None

    def create_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_container', *args, **kwargs)
        return {'Id': self._call(cmd_str)}

    def start(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('start', *args, **kwargs)
        self._call(cmd_str)

    def restart(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('restart', *args, **kwargs)
        self._call(cmd_str)

    def stop(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('stop', *args, **kwargs)
        self._call(cmd_str)

    def remove_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_container', *args, **kwargs)
        self._call(cmd_str)

    def remove_image(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_image', *args, **kwargs)
        self._call(cmd_str)

    def kill(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('kill', *args, **kwargs)
        self._call(cmd_str)

    def wait(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('wait', *args, **kwargs)
        self._call(cmd_str)

    def containers(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('containers', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_containers_output(res)

    def inspect_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_container', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res, 'container')

    def images(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('images', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_images_output(res)

    def pull(self, repository, tag=None, **kwargs):
        repo_tag = '{0}:{1}'.format(repository, tag) if tag else repository
        cmd_str = self._out.get_cmd('pull', repo_tag, **kwargs)
        self._call(cmd_str)

    def push(self, repository, tag=None, **kwargs):
        repo_tag = '{0}:{1}'.format(repository, tag) if tag else repository
        cmd_str = self._out.get_cmd('push', repo_tag, **kwargs)
        self._call(cmd_str)

    def create_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_network', *args, **kwargs)
        return {'Id': self._call(cmd_str)}

    def remove_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_network', *args, **kwargs)
        self._call(cmd_str)

    def connect_container_to_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('connect_container_to_network', *args, **kwargs)
        self._call(cmd_str)

    def disconnect_container_from_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('disconnect_container_from_network', *args, **kwargs)
        self._call(cmd_str)

    def networks(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('networks', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_networks_output(res)

    def inspect_network(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_network', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res, 'network')

    def create_volume(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_volume', *args, **kwargs)
        return {'Name': self._call(cmd_str)}

    def remove_volume(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_volume', *args, **kwargs)
        self._call(cmd_str)

    def volumes(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('volumes', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return {'Volumes': parse_volumes_output(res), 'Warnings': None}

    def inspect_volume(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_volume', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res, 'volume')

    def exec_create(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('exec_create', *args, **kwargs)
        self._call(cmd_str)

    def exec_start(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('exec_start', *args, **kwargs)
        self._call(cmd_str)

    def top(self, container, ps_args):
        if ps_args:
            cmd_str = self._out.get_cmd('top', container, ps_args)
        else:
            cmd_str = self._out.get_cmd('top', container)
        res = self._call(cmd_str, quiet=True)
        return parse_top_output(res)

    def tag(self, image, repository, tag=None, **kwargs):
        if tag:
            repo_tag = '{0}:{1}'.format(repository, tag)
        else:
            repo_tag = repository
        cmd_str = self._out.get_cmd('tag', image, repo_tag, **kwargs)
        return self._call(cmd_str)

    def logs(self, *args, **kwargs):
        kwargs.pop('stream', None)
        cmd_str = self._out.get_cmd('logs', *args, **kwargs)
        return self._call(cmd_str, quiet=True)

    def login(self, **kwargs):
        for key, variable in [
            ('username', 'user'),
            ('password', 'password'),
            ('email', 'mail'),
            ('registry', 'repository'),
            ('insecure_registry', 'insecure')
        ]:
            if key not in kwargs:
                env_value = env.get('docker_registry_{0}'.format(variable))
                if env_value:
                    kwargs[key] = env_value
        registry = kwargs.pop('registry', env.get('docker_registry_repository'))
        if registry:
            cmd_str = self._out.get_cmd('login', registry, **kwargs)
        else:
            cmd_str = self._out.get_cmd('login', **kwargs)
        res = self._call(cmd_str, quiet=True)
        lines = res.splitlines()
        fastprint(lines)
        return 'Login Succeeded' in lines

    def build(self, tag, add_latest_tag=False, add_tags=None, raise_on_error=True, **kwargs):
        try:
            context = kwargs.pop('fileobj')
        except KeyError:
            raise ValueError("'fileobj' needs to be provided. Using 'path' is currently not implemented.")
        for a in ['custom_context', 'encoding']:
            kwargs.pop(a, None)

        with temp_dir() as remote_tmp:
            remote_fn = posixpath.join(remote_tmp, 'context')
            put(context, remote_fn)
            cmd_str = self._out.get_cmd('build', '- <', remote_fn, tag=tag, **kwargs)
            with settings(warn_only=not raise_on_error):
                res = self._call(cmd_str)
        if res:
            image_id = _find_image_id(res)
            if image_id:
                self.add_extra_tags(image_id, tag, add_tags, add_latest_tag)
                return image_id
        return None

    def version(self, **kwargs):
        kwargs.pop('api_version', None)
        cmd_str = self._out.get_cmd('version')
        res = self._call(cmd_str, quiet=True)
        version_dict = parse_version_output(res)
        return version_dict

    def push_log(self, info, level, *args, **kwargs):
        pass

    def _update_api_version(self):
        if self.api_version and self.api_version != 'auto':
            return
        version_dict = self.version()
        if 'APIVersion' in version_dict:
            self.api_version = version_dict['APIVersion']
        elif 'ApiVersion' in version_dict:
            self.api_version = version_dict['ApiVersion']

    def run_cmd(self, command):
        sudo(command)
Ejemplo n.º 6
0
class DockerCliClient(DockerUtilityMixin):
    def __init__(self, cmd_prefix=None, default_bin='docker', base_url=None, tls=None, use_sudo=False):
        super(DockerCliClient, self).__init__()
        if base_url:
            cmd_args = ['-H {0}'.format(base_url)]
        else:
            cmd_args = []
        if tls:
            cmd_args.append('--tls')
        self._out = DockerCommandLineOutput(cmd_prefix, default_bin, cmd_args or None)
        if use_sudo:
            self._call_method = sudo
        else:
            self._call_method = run

    def _call(self, cmd, quiet=False):
        if cmd:
            return self._call_method(cmd, shell=False, quiet=quiet)
        return None

    def create_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('create_container', *args, **kwargs)
        return {'Id': self._call(cmd_str)}

    def start(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('start', *args, **kwargs)
        self._call(cmd_str)

    def restart(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('restart', *args, **kwargs)
        self._call(cmd_str)

    def stop(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('stop', *args, **kwargs)
        self._call(cmd_str)

    def remove_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_container', *args, **kwargs)
        self._call(cmd_str)

    def remove_image(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('remove_image', *args, **kwargs)
        self._call(cmd_str)

    def kill(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('kill', *args, **kwargs)
        self._call(cmd_str)

    def wait(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('wait', *args, **kwargs)
        self._call(cmd_str)

    def containers(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('containers', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_containers_output(res)

    def inspect_container(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('inspect_container', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_inspect_output(res)

    def images(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('images', *args, **kwargs)
        res = self._call(cmd_str, quiet=True)
        return parse_images_output(res)

    def pull(self, repository, tag=None, **kwargs):
        repo_tag = '{0}:{1}'.format(repository, tag) if tag else repository
        cmd_str = self._out.get_cmd('pull', repo_tag, **kwargs)
        self._call(cmd_str)

    def push(self, repository, tag=None, **kwargs):
        repo_tag = '{0}:{1}'.format(repository, tag) if tag else repository
        cmd_str = self._out.get_cmd('push', repo_tag, **kwargs)
        self._call(cmd_str)

    def exec_create(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('exec_create', *args, **kwargs)
        self._call(cmd_str)

    def exec_start(self, *args, **kwargs):
        cmd_str = self._out.get_cmd('exec_start', *args, **kwargs)
        self._call(cmd_str)

    def tag(self, image, repository, tag=None, **kwargs):
        if tag:
            repo_tag = '{0}:{1}'.format(repository, tag)
        else:
            repo_tag = repository
        cmd_str = self._out.get_cmd('tag', image, repo_tag, **kwargs)
        return self._call(cmd_str)

    def logs(self, *args, **kwargs):
        kwargs.pop('stream', None)
        cmd_str = self._out.get_cmd('logs', *args, **kwargs)
        return self._call(cmd_str, quiet=True)

    def login(self, **kwargs):
        for key, variable in [
            ('username', 'user'),
            ('password', 'password'),
            ('email', 'mail'),
            ('registry', 'repository'),
            ('insecure_registry', 'insecure')
        ]:
            if key not in kwargs:
                env_value = env.get('docker_registry_{0}'.format(variable))
                if env_value:
                    kwargs[key] = env_value
        registry = kwargs.pop('registry', env.get('docker_registry_repository'))
        if registry:
            cmd_str = self._out.get_cmd('login', registry, **kwargs)
        else:
            cmd_str = self._out.get_cmd('login', **kwargs)
        res = self._call(cmd_str, quiet=True)
        lines = res.splitlines()
        fastprint(lines)
        return 'Login Succeeded' in lines

    def build(self, tag, add_latest_tag=False, add_tags=None, raise_on_error=False, **kwargs):
        try:
            context = kwargs.pop('fileobj')
        except KeyError:
            raise ValueError("'fileobj' needs to be provided. Using 'path' is currently not implemented.")
        for a in ['custom_context', 'encoding']:
            kwargs.pop(a, None)

        with temp_dir() as remote_tmp:
            remote_fn = posixpath.join(remote_tmp, 'context')
            put(context, remote_fn)
            cmd_str = self._out.get_cmd('build', '- <', remote_fn, tag=tag, **kwargs)
            with settings(warn_only=not raise_on_error):
                res = self._call(cmd_str)
        if res:
            last_log = res.splitlines()[-1]
            if last_log and last_log.startswith('Successfully built '):
                image_id = last_log[19:]  # Remove prefix
                self.add_extra_tags(image_id, tag, add_tags, add_latest_tag)
                return image_id
        return None

    def push_log(self, info, level, *args, **kwargs):
        pass