diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 390bab198..3b7ca0e78 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -77,6 +77,7 @@ managed-testcontainers-oracle-free = { module = "org.testcontainers:oracle-free"
 managed-testcontainers-postgres = { module = "org.testcontainers:postgresql", version.ref = "managed-testcontainers" }
 managed-testcontainers-rabbitmq = { module = "org.testcontainers:rabbitmq", version.ref = "managed-testcontainers" }
 managed-testcontainers-redis = { module = "com.redis.testcontainers:testcontainers-redis", version.ref = "managed-testcontainers-redis" }
+managed-testcontainers-minio = { module = "org.testcontainers:minio", version.ref = "managed-testcontainers" }
 managed-testcontainers-r2dbc = { module = "org.testcontainers:r2dbc", version.ref = "managed-testcontainers" }
 managed-testcontainers-vault = { module = "org.testcontainers:vault", version.ref = "managed-testcontainers" }
 
diff --git a/settings.gradle b/settings.gradle
index da0e8dc5e..db35150a1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -70,6 +70,7 @@ include 'test-resources-elasticsearch'
 include 'test-resources-embedded'
 include 'test-resources-hivemq'
 include 'test-resources-kafka'
+include 'test-resources-minio'
 include 'test-resources-mongodb'
 include 'test-resources-neo4j'
 include 'test-resources-opensearch'
diff --git a/src/main/docs/guide/modules-minio.adoc b/src/main/docs/guide/modules-minio.adoc
new file mode 100644
index 000000000..44f979290
--- /dev/null
+++ b/src/main/docs/guide/modules-minio.adoc
@@ -0,0 +1,8 @@
+MinIO support will automatically start a https://min.io[MinIO] container via https://java.testcontainers.org/modules/minio/[Testcontainers] and provide the value of the `minio.url` property.
+
+The default image can be overwritten by setting the `test-resources.containers.minio.image-name` property.
+
+In addition, the following properties will be resolved by test resources:
+
+- `minio.access-key`
+- `minio.secret-key`
diff --git a/src/main/docs/guide/toc.yml b/src/main/docs/guide/toc.yml
index d1581fe66..8f769ad8d 100644
--- a/src/main/docs/guide/toc.yml
+++ b/src/main/docs/guide/toc.yml
@@ -19,6 +19,8 @@ modules:
     title: Kafka
   modules-localstack:
     title: Localstack
+  modules-minio:
+    title: MinIO
   modules-mongodb:
     title: MongoDB
   modules-mqtt:
diff --git a/test-resources-minio/build.gradle b/test-resources-minio/build.gradle
new file mode 100644
index 000000000..9b4795af9
--- /dev/null
+++ b/test-resources-minio/build.gradle
@@ -0,0 +1,16 @@
+plugins {
+    id 'io.micronaut.build.internal.test-resources-module'
+}
+
+description = """
+Provides support for launching a MinIO test container.
+"""
+
+dependencies {
+    api(project(':micronaut-test-resources-core'))
+    api(project(':micronaut-test-resources-testcontainers'))
+    api(libs.managed.testcontainers.minio)
+
+    testImplementation(project(":micronaut-test-resources-embedded"))
+    testImplementation(testFixtures(project(":micronaut-test-resources-testcontainers")))
+}
diff --git a/test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java b/test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java
new file mode 100644
index 000000000..cbcbd5e03
--- /dev/null
+++ b/test-resources-minio/src/main/java/io/micronaut/testresources/minio/MinioTestResourceProvider.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017-2021 original authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.micronaut.testresources.minio;
+
+import io.micronaut.testresources.testcontainers.AbstractTestContainersProvider;
+import org.testcontainers.containers.MinIOContainer;
+import org.testcontainers.utility.DockerImageName;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+
+/**
+ * A test resource provider which will spawn a MinIO test container.
+ */
+public class MinioTestResourceProvider extends AbstractTestContainersProvider<MinIOContainer> {
+
+    public static final String MINIO_URL = "minio.url";
+    public static final String MINIO_ACCESS_KEY = "minio.access-key";
+    public static final String MINIO_SECRET_KEY = "minio.secret-key";
+
+    public static final List<String> RESOLVABLE_PROPERTIES = List.of(
+        MINIO_URL,
+        MINIO_ACCESS_KEY,
+        MINIO_SECRET_KEY
+    );
+
+    public static final String DEFAULT_IMAGE = "minio/minio";
+    public static final String SIMPLE_NAME = "minio";
+    public static final String DISPLAY_NAME = "MinIO";
+
+
+    @Override
+    public String getDisplayName() {
+        return DISPLAY_NAME;
+    }
+
+    @Override
+    protected String getSimpleName() {
+        return SIMPLE_NAME;
+    }
+
+    @Override
+    protected String getDefaultImageName() {
+        return DEFAULT_IMAGE;
+    }
+
+    @Override
+    protected MinIOContainer createContainer(DockerImageName imageName, Map<String, Object> requestedProperties, Map<String, Object> testResourcesConfig) {
+        return new MinIOContainer(imageName);
+    }
+
+    @Override
+    protected Optional<String> resolveProperty(String propertyName, MinIOContainer container) {
+        if (MINIO_URL.equals(propertyName)) {
+            return Optional.of(container.getS3URL());
+        }
+        if (MINIO_ACCESS_KEY.equals(propertyName)) {
+            return Optional.of(container.getUserName());
+        }
+        if (MINIO_SECRET_KEY.equals(propertyName)) {
+            return Optional.of(container.getPassword());
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public List<String> getResolvableProperties(Map<String, Collection<String>> propertyEntries, Map<String, Object> testResourcesConfig) {
+        return RESOLVABLE_PROPERTIES;
+    }
+
+    @Override
+    protected boolean shouldAnswer(String propertyName, Map<String, Object> requestedProperties, Map<String, Object> testResourcesConfig) {
+        return RESOLVABLE_PROPERTIES.contains(propertyName);
+    }
+
+}
diff --git a/test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver b/test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver
new file mode 100644
index 000000000..f1242d8e4
--- /dev/null
+++ b/test-resources-minio/src/main/resources/META-INF/services/io.micronaut.testresources.core.TestResourcesResolver
@@ -0,0 +1 @@
+io.micronaut.testresources.minio.MinioTestResourceProvider
diff --git a/test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy b/test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy
new file mode 100644
index 000000000..fdd1a1fea
--- /dev/null
+++ b/test-resources-minio/src/test/groovy/io/micronaut/testresources/minio/MinioStartedTest.groovy
@@ -0,0 +1,37 @@
+package io.micronaut.testresources.minio
+
+import io.micronaut.context.annotation.Value
+import io.micronaut.test.extensions.spock.annotation.MicronautTest
+import io.micronaut.testresources.testcontainers.AbstractTestContainersSpec
+import org.testcontainers.DockerClientFactory
+
+@MicronautTest
+class MinioStartedTest extends AbstractTestContainersSpec {
+
+    @Value('${minio.url}')
+    String url
+
+    @Value('${minio.access-key}')
+    String accessKey
+
+    @Value('${minio.access-key}')
+    String secretKey
+
+    @Override
+    String getScopeName() {
+        'minio'
+    }
+
+    def "automatically starts a MinIO container"() {
+        given:
+        def dockerHost = DockerClientFactory.instance().dockerHostIpAddress()
+
+        expect:
+        dockerHost in ["localhost", "127.0.0.1"]
+        listContainers().size() == 1
+        url.contains(dockerHost)
+        accessKey == "minioadmin"
+        secretKey == "minioadmin"
+    }
+
+}
diff --git a/test-resources-minio/src/test/resources/logback.xml b/test-resources-minio/src/test/resources/logback.xml
new file mode 100644
index 000000000..44b79c40d
--- /dev/null
+++ b/test-resources-minio/src/test/resources/logback.xml
@@ -0,0 +1,14 @@
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- encoders are assigned the type
+             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>