### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

I am using the latest tag for the CI/CD process and today it started to fail because unit tests for the S3 provider that cover multipart upload throw the "Expected hash not equal to calculated hash" error on uploading a part. It worked just fine with the old version. The same unit tests work correctly with the real S3 provider as well.

And there is another issue. You fixed the https://github.com/localstack/localstack/issues/8392 bug that I reported previously but there is no version on Docker Hub that has that fix but does not have the new bug I described above. It seems that you rewrite the latest tag in Docker Hub which makes it impossible to rollback to the previous version.

### Expected Behavior

1. The upload part works without throwing an exception.
2. The previous versions of Docker images are available on Docker Hub.

### How are you starting LocalStack?

With a docker-compose file

### Steps To Reproduce

1. Initiate multipart upload with the correct MD5 hash.
2. Upload a part for which the hash was calculated.

### Environment

```markdown
- OS: Windows 11
- LocalStack: latest
```


### Anything else?

_No response_
fn,
        self,
        bucket_name: str,
        query: dict[str, Any],
        key_name: str,
        headers: dict[str, Any],
        *args,
        **kwargs,
    ) -> TYPE_RESPONSE:
        """Return an iterator if the content returned is a `SpooledTemporaryFile`, which indicates that the return
        value is from `GetObject`. We transform this stream into an iterator, to control how much we return"""
        code, response_headers, body = fn(
            self, bucket_name, query, key_name, headers, *args, **kwargs
        )
        if isinstance(body, SpooledTemporaryFile):
            
            version_id = query.get("versionId", [None])[0]
            key = self.backend.get_object(bucket_name, key_name, version_id=version_id)
            
            
            
            if code == 200 and (range_header := headers.get("range", "")) != "":
                length = key.size
                last = length - 1
                _, rspec = range_header.split("=")
                if "," in rspec:
                    raise NotImplementedError("Multiple range specifiers not supported")
                def toint(i: Any) -> Optional[int]: