docs: def build(self, tag, add_latest_tag=False, add_tags=None, raise_on_error=True, **kwargs):
          """
          Overrides the superclass `build()` and filters the output. Messages are deferred to `push_log`, whereas the
          final message is checked for a success message. If the latter is found, only the new image id is returned.
  
          :param tag: Tag of the new image to be built. Unlike in the superclass, this is obligatory.
          :type tag: unicode | str
          :param add_latest_tag: In addition to the image ``tag``, tag the image with ``latest``.
          :type add_latest_tag: bool
          :param add_tags: Additional tags. Can also be used as an alternative to ``add_latest_tag``.
          :type add_tags: list[unicode | str]
          :param raise_on_error: Raises errors in the status output as a DockerStatusException. Otherwise only logs
           errors.
          :type raise_on_error: bool
          :param kwargs: See :meth:`docker.client.Client.build`.
          :return: New, generated image id or `None`.
          :rtype: unicode | str
          """
          response = super(DockerClientWrapper, self).build(tag=tag, **kwargs)
          # It is not the kwargs alone that decide if we get a stream, so we have to check.
          if isinstance(response, tuple):
              image_id = response[0]
          else:
              last_log = self._docker_log_stream(response, raise_on_error)
              if last_log and last_log.startswith('Successfully built '):
                  image_id = last_log[19:]  # Remove prefix
              else:
                  image_id = None
  
          if not image_id:
              return None
  
          self.add_extra_tags(image_id, tag, add_tags, add_latest_tag)
          return image_id