<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_docker_secret(name, default=None, cast_to=str, autocast_name=True, getenv=True, safe=True, secrets_dir=os.path.join(root, 'var', 'run', 'secrets')):
 """This function fetches a docker secret :param name: the name of the docker secret :param default: the default value if no secret found :param cast_to: casts the value to the given type :param autocast_name: whether the name should be lowercase for secrets and upper case for environment :param getenv: if environment variable should be fetched as fallback :param safe: Whether the function should raise exceptions :param secrets_dir: the directory where the secrets are stored :returns: docker secret or environment variable depending on params :raises TypeError: if cast fails due to wrong type (None) :raises ValueError: if casts fails due to Value """


    # cast name if autocast enabled
    name_secret = name.lower() if autocast_name else name
    name_env = name.upper() if autocast_name else name

    # initiallize value
    value = None

    # try to read from secret file
    try:
        with open(os.path.join(secrets_dir, name_secret), 'r') as secret_file:
            value = secret_file.read()
    except IOError as e:
        # try to read from env if enabled
        if getenv:
            value = os.environ.get(name_env)

    # set default value if no value found
    if value is None:
        value = default

    # try to cast
    try:
        # so None wont be cast to 'None'
        if value is None:
            raise TypeError('value is None')

        # special case bool
        if cast_to == bool:
            if value not in ('True', 'true', 'False', 'false'):
                raise ValueError('value %s not of type bool' % value)
            value = 1 if value in ('True', 'true') else 0

        # try to cast
        return cast_to(value)

    except (TypeError, ValueError) as e:
        # whether exception should be thrown
        if safe:
            return default
        raise e