Skip to content

RustFS Module ​

RustFS is a high-performance, S3-compatible distributed object storage system written in Rust. Use this module to run RustFS in a testcontainer during integration testing.

Installation ​

bash
go get github.com/foomo/testcontainers-go/modules/rustfs

Usage ​

Import the module and start a container:

go
package mypackage

import (
	"testing"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/credentials"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/foomo/testcontainers-go/modules/rustfs"
)

func TestObjectStorage(t *testing.T) {
	container, err := rustfs.Run(t.Context(), "rustfs/rustfs:latest")
	if err != nil {
		t.Fatal(err)
	}

	endpoint, err := container.Endpoint(t.Context())
	if err != nil {
		t.Fatal(err)
	}

	client := s3.New(s3.Options{
		BaseEndpoint: aws.String(endpoint),
		Region:       "us-east-1",
		UsePathStyle: true,
		Credentials: credentials.NewStaticCredentialsProvider(
			container.AccessKey,
			container.SecretKey,
			"",
		),
	})

	resp, err := client.ListBuckets(t.Context(), &s3.ListBucketsInput{})
	if err != nil {
		t.Fatal(err)
	}
	_ = resp
}

Exposed Ports ​

The RustFS container exposes two ports:

PortProtocolPurpose
9000HTTPS3-compatible API endpoint
9001HTTPWeb console UI

Container Configuration ​

The module starts RustFS with the following defaults:

  • Image: Any rustfs/rustfs image (e.g. rustfs/rustfs:latest)
  • Exposed Ports: 9000/tcp, 9001/tcp
  • Credentials: RUSTFS_ACCESS_KEY=rustfsadmin, RUSTFS_SECRET_KEY=rustfsadmin

Getting the Endpoint ​

Use Endpoint() to get the S3 API URL, and ConsoleEndpoint() for the web console:

go
endpoint, err := container.Endpoint(t.Context())
// endpoint is something like "http://localhost:56789"

console, err := container.ConsoleEndpoint(t.Context())
// console is something like "http://localhost:56790"

The container struct also exposes AccessKey and SecretKey fields with the credentials used to start the container.

Advanced Configuration ​

Pass additional testcontainers.ContainerCustomizer options to customize the container, for example to override credentials:

go
container, err := rustfs.Run(
    t.Context(),
    "rustfs/rustfs:latest",
    testcontainers.WithEnv(map[string]string{
        "RUSTFS_ACCESS_KEY": "myaccesskey",
        "RUSTFS_SECRET_KEY": "mysecretkey",
    }),
)

Note: the AccessKey / SecretKey fields on the container struct will still hold the module defaults — if you override the env vars, track the new values yourself.

Common customizers:

  • WithEnv(map[string]string{...}) — Set environment variables
  • WithLogger(logger) — Provide a custom logger
  • WithLogConsumers(consumers...) — Capture logs from the container

See the testcontainers-go documentation for a full list of options.

Cleanup ​

The container is automatically cleaned up when the test ends. For explicit cleanup, use:

go
err := container.Terminate(t.Context())
if err != nil {
    t.Fatal(err)
}