You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by gi...@apache.org on 2026/09/24 18:52:12 UTC
(iceberg-rust) branch gh-readonly-queue/main/pr-3273-c9a25b23b7645f3af0e9dfd7e85d8cf646901c55 created (now 119fad92c)
This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a change to branch gh-readonly-queue/main/pr-3273-c9a25b23b7645f3af0e9dfd7e85d8cf646901c55
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
at 119fad92c ci: replace MinIO with RustFS for integration tests (#3273)
This branch includes the following new commits:
new 119fad92c ci: replace MinIO with RustFS for integration tests (#3273)
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(iceberg-rust) 01/01: ci: replace MinIO with RustFS for integration tests (#3273)
Posted by gi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-3273-c9a25b23b7645f3af0e9dfd7e85d8cf646901c55
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
commit 119fad92c891c95a7819d87e4195407b3f7c0578
Author: Oleks V <co...@users.noreply.github.com>
AuthorDate: Thu Sep 24 18:51:51 2026 +0000
ci: replace MinIO with RustFS for integration tests (#3273)
* ci: replace MinIO with RustFS for integration tests
`quay.io/minio/minio` no longer allows anonymous pulls, so
`make docker-up` fails and the integration tests cannot start.
DataFusion hit the same failure and switched to RustFS in
apache/datafusion#25706. PyIceberg moved to RustFS earlier in
apache/iceberg-python#3928.
Run `rustfs/rustfs:1.0.0` as the shared S3 service instead. It keeps
the `admin`/`password` credentials, the 9000/9001 ports, and
virtual-hosted-style access through `RUSTFS_SERVER_DOMAINS` and the
bucket aliases. The healthcheck uses `/health/ready`, which waits for
storage and IAM. The `mc` bucket setup becomes `curl --aws-sigv4` run
from the RustFS image, and the public bucket policy is dropped because
no test reads anonymously.
Point the REST fixture, HMS, and Spark at `http://rustfs:9000`, and
rename the MinIO-specific test helpers and the
`ICEBERG_TEST_MINIO_ENDPOINT` override to RustFS.
Closes #3272
* ci: use vendor-neutral object-store naming for S3 test service
Rename the RustFS service, hostname, bucket aliases, test helpers and env
var to a generic object-store name (matching PyIceberg), so future
backend swaps only need an image change.
Co-authored-by: Copilot App <22...@users.noreply.github.com>
* ci: fail fast and gate readiness on test bucket creation
Treat any non-200/409 response as a failure instead of ignoring it, and
add a healthcheck so `docker compose up --wait` blocks until the buckets
exist.
Co-authored-by: Copilot App <22...@users.noreply.github.com>
* ci: remove orphan containers on docker-up
Renaming the minio service leaves stale containers holding port 9000 for
anyone with a previously started stack; clean them up automatically.
Co-authored-by: Copilot App <22...@users.noreply.github.com>
* ci: make create-buckets a one-shot job
RustFS returns 200 when re-creating an existing bucket, so plain chained
curl -f calls are idempotent. Replace the status-code parsing, marker-file
healthcheck and tail with a one-shot container, and gate spark-iceberg on
its successful completion.
Co-authored-by: Copilot App <22...@users.noreply.github.com>
---------
Co-authored-by: ovoievodin <o_...@apple.com>
Co-authored-by: Kevin Liu <ke...@gmail.com>
Co-authored-by: Copilot App <22...@users.noreply.github.com>
---
Makefile | 2 +-
crates/catalog/hms/tests/hms_catalog_test.rs | 6 +--
crates/catalog/loader/tests/common/mod.rs | 11 ++--
crates/integration_tests/src/lib.rs | 6 +--
crates/storage/opendal/tests/file_io_s3_test.rs | 20 ++++----
.../opendal/tests/resolving_storage_test.rs | 16 +++---
crates/test_utils/src/lib.rs | 14 +++---
dev/docker-compose.yaml | 58 +++++++++-------------
dev/hms/core-site.xml | 2 +-
dev/spark/spark-defaults.conf | 2 +-
website/src/reference/container-runtimes.md | 2 +-
11 files changed, 65 insertions(+), 74 deletions(-)
diff --git a/Makefile b/Makefile
index d27893390..5371c4228 100644
--- a/Makefile
+++ b/Makefile
@@ -112,7 +112,7 @@ site: install-mdbook
# Docker targets for integration tests
docker-up:
- docker compose -f dev/docker-compose.yaml up -d --build --wait
+ docker compose -f dev/docker-compose.yaml up -d --build --wait --remove-orphans
docker-down:
docker compose -f dev/docker-compose.yaml down -v --remove-orphans --timeout 0
diff --git a/crates/catalog/hms/tests/hms_catalog_test.rs b/crates/catalog/hms/tests/hms_catalog_test.rs
index d0e6486ad..b64184ce7 100644
--- a/crates/catalog/hms/tests/hms_catalog_test.rs
+++ b/crates/catalog/hms/tests/hms_catalog_test.rs
@@ -33,7 +33,7 @@ use iceberg_catalog_hms::{
HmsCatalog, HmsCatalogBuilder, THRIFT_TRANSPORT_BUFFERED,
};
use iceberg_storage_opendal::OpenDalStorageFactory;
-use iceberg_test_utils::{get_hms_endpoint, get_minio_endpoint, set_up};
+use iceberg_test_utils::{get_hms_endpoint, get_object_store_endpoint, set_up};
use tokio::time::sleep;
use tracing::info;
@@ -43,7 +43,7 @@ async fn get_catalog() -> HmsCatalog {
set_up();
let hms_endpoint = get_hms_endpoint();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
let props = HashMap::from([
(HMS_CATALOG_PROP_URI.to_string(), hms_endpoint),
@@ -55,7 +55,7 @@ async fn get_catalog() -> HmsCatalog {
HMS_CATALOG_PROP_WAREHOUSE.to_string(),
"s3a://warehouse/hive".to_string(),
),
- (S3_ENDPOINT.to_string(), minio_endpoint),
+ (S3_ENDPOINT.to_string(), object_store_endpoint),
(S3_ACCESS_KEY_ID.to_string(), "admin".to_string()),
(S3_SECRET_ACCESS_KEY.to_string(), "password".to_string()),
(S3_REGION.to_string(), "us-east-1".to_string()),
diff --git a/crates/catalog/loader/tests/common/mod.rs b/crates/catalog/loader/tests/common/mod.rs
index 2b5033e6f..0b7e22cea 100644
--- a/crates/catalog/loader/tests/common/mod.rs
+++ b/crates/catalog/loader/tests/common/mod.rs
@@ -50,7 +50,8 @@ use iceberg_catalog_sql::{
};
use iceberg_storage_opendal::OpenDalStorageFactory;
use iceberg_test_utils::{
- get_glue_endpoint, get_hms_endpoint, get_minio_endpoint, get_rest_catalog_endpoint, set_up,
+ get_glue_endpoint, get_hms_endpoint, get_object_store_endpoint, get_rest_catalog_endpoint,
+ set_up,
};
use sqlx::migrate::MigrateDatabase;
use tempfile::TempDir;
@@ -230,7 +231,7 @@ async fn rest_catalog(kms_client_factory: Arc<dyn KmsClientFactory>) -> RestCata
async fn glue_catalog(kms_client_factory: Arc<dyn KmsClientFactory>) -> GlueCatalog {
let glue_endpoint = get_glue_endpoint();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
let props = HashMap::from([
(AWS_ACCESS_KEY_ID.to_string(), "my_access_id".to_string()),
@@ -239,7 +240,7 @@ async fn glue_catalog(kms_client_factory: Arc<dyn KmsClientFactory>) -> GlueCata
"my_secret_key".to_string(),
),
(AWS_REGION_NAME.to_string(), "us-east-1".to_string()),
- (S3_ENDPOINT.to_string(), minio_endpoint),
+ (S3_ENDPOINT.to_string(), object_store_endpoint),
(S3_ACCESS_KEY_ID.to_string(), "admin".to_string()),
(S3_SECRET_ACCESS_KEY.to_string(), "password".to_string()),
(S3_REGION.to_string(), "us-east-1".to_string()),
@@ -279,7 +280,7 @@ async fn glue_catalog(kms_client_factory: Arc<dyn KmsClientFactory>) -> GlueCata
async fn hms_catalog(kms_client_factory: Arc<dyn KmsClientFactory>) -> HmsCatalog {
let hms_endpoint = get_hms_endpoint();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
let props = HashMap::from([
(HMS_CATALOG_PROP_URI.to_string(), hms_endpoint),
@@ -291,7 +292,7 @@ async fn hms_catalog(kms_client_factory: Arc<dyn KmsClientFactory>) -> HmsCatalo
HMS_CATALOG_PROP_WAREHOUSE.to_string(),
"s3a://warehouse/hive".to_string(),
),
- (S3_ENDPOINT.to_string(), minio_endpoint),
+ (S3_ENDPOINT.to_string(), object_store_endpoint),
(S3_ACCESS_KEY_ID.to_string(), "admin".to_string()),
(S3_SECRET_ACCESS_KEY.to_string(), "password".to_string()),
(S3_REGION.to_string(), "us-east-1".to_string()),
diff --git a/crates/integration_tests/src/lib.rs b/crates/integration_tests/src/lib.rs
index feafa3ae9..c137b46f8 100644
--- a/crates/integration_tests/src/lib.rs
+++ b/crates/integration_tests/src/lib.rs
@@ -22,7 +22,7 @@ use iceberg::io::{
S3_ACCESS_KEY_ID, S3_ENDPOINT, S3_PATH_STYLE_ACCESS, S3_REGION, S3_SECRET_ACCESS_KEY,
};
use iceberg_catalog_rest::REST_CATALOG_PROP_URI;
-use iceberg_test_utils::{get_minio_endpoint, get_rest_catalog_endpoint, set_up};
+use iceberg_test_utils::{get_object_store_endpoint, get_rest_catalog_endpoint, set_up};
/// Global test fixture that uses environment-based configuration.
/// This assumes Docker containers are started externally (e.g., via `make docker-up`).
@@ -39,11 +39,11 @@ impl GlobalTestFixture {
set_up();
let rest_endpoint = get_rest_catalog_endpoint();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
let catalog_config = HashMap::from([
(REST_CATALOG_PROP_URI.to_string(), rest_endpoint),
- (S3_ENDPOINT.to_string(), minio_endpoint),
+ (S3_ENDPOINT.to_string(), object_store_endpoint),
(S3_ACCESS_KEY_ID.to_string(), "admin".to_string()),
(S3_SECRET_ACCESS_KEY.to_string(), "password".to_string()),
(S3_REGION.to_string(), "us-east-1".to_string()),
diff --git a/crates/storage/opendal/tests/file_io_s3_test.rs b/crates/storage/opendal/tests/file_io_s3_test.rs
index 6b57f8660..ac6342ddd 100644
--- a/crates/storage/opendal/tests/file_io_s3_test.rs
+++ b/crates/storage/opendal/tests/file_io_s3_test.rs
@@ -32,19 +32,19 @@ mod tests {
use iceberg_storage_opendal::{
AwsCredential, CustomAwsCredentialLoader, OpenDalStorageFactory, ProvideCredential,
};
- use iceberg_test_utils::{get_minio_endpoint, normalize_test_name_with_parts, set_up};
+ use iceberg_test_utils::{get_object_store_endpoint, normalize_test_name_with_parts, set_up};
use reqsign_core::Context;
async fn get_file_io() -> FileIO {
set_up();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
FileIOBuilder::new(Arc::new(OpenDalStorageFactory::S3 {
customized_credential_load: None,
}))
.with_props(vec![
- (S3_ENDPOINT, minio_endpoint),
+ (S3_ENDPOINT, object_store_endpoint),
(S3_ACCESS_KEY_ID, "admin".to_string()),
(S3_SECRET_ACCESS_KEY, "password".to_string()),
(S3_REGION, "us-east-1".to_string()),
@@ -138,7 +138,7 @@ mod tests {
Self { credential }
}
- fn new_minio() -> Self {
+ fn new_object_store() -> Self {
Self::new(Some(AwsCredential {
access_key_id: "admin".to_string(),
secret_access_key: "password".to_string(),
@@ -162,7 +162,7 @@ mod tests {
#[test]
fn test_custom_aws_credential_loader_instantiation() {
// Test creating CustomAwsCredentialLoader with mock loader
- let mock_loader = MockCredentialLoader::new_minio();
+ let mock_loader = MockCredentialLoader::new_object_store();
let custom_loader = CustomAwsCredentialLoader::new(mock_loader);
// Test that the loader can be used in FileIOBuilder with OpenDalStorageFactory
@@ -182,17 +182,17 @@ mod tests {
let _file_io = get_file_io().await;
// Create a mock credential loader
- let mock_loader = MockCredentialLoader::new_minio();
+ let mock_loader = MockCredentialLoader::new_object_store();
let custom_loader = CustomAwsCredentialLoader::new(mock_loader);
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
// Build FileIO with custom credential loader via OpenDalStorageFactory
let file_io_with_custom_creds = FileIOBuilder::new(Arc::new(OpenDalStorageFactory::S3 {
customized_credential_load: Some(custom_loader),
}))
.with_props(vec![
- (S3_ENDPOINT, minio_endpoint),
+ (S3_ENDPOINT, object_store_endpoint),
(S3_REGION, "us-east-1".to_string()),
(S3_PATH_STYLE_ACCESS, "true".to_string()),
])
@@ -213,14 +213,14 @@ mod tests {
let mock_loader = MockCredentialLoader::new(None);
let custom_loader = CustomAwsCredentialLoader::new(mock_loader);
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
// Build FileIO with custom credential loader via OpenDalStorageFactory
let file_io_with_custom_creds = FileIOBuilder::new(Arc::new(OpenDalStorageFactory::S3 {
customized_credential_load: Some(custom_loader),
}))
.with_props(vec![
- (S3_ENDPOINT, minio_endpoint),
+ (S3_ENDPOINT, object_store_endpoint),
(S3_REGION, "us-east-1".to_string()),
(S3_PATH_STYLE_ACCESS, "true".to_string()),
])
diff --git a/crates/storage/opendal/tests/resolving_storage_test.rs b/crates/storage/opendal/tests/resolving_storage_test.rs
index ba94b8332..bcc3d5184 100644
--- a/crates/storage/opendal/tests/resolving_storage_test.rs
+++ b/crates/storage/opendal/tests/resolving_storage_test.rs
@@ -33,16 +33,16 @@ mod tests {
S3_SECRET_ACCESS_KEY,
};
use iceberg_storage_opendal::OpenDalResolvingStorageFactory;
- use iceberg_test_utils::{get_minio_endpoint, normalize_test_name_with_parts, set_up};
+ use iceberg_test_utils::{get_object_store_endpoint, normalize_test_name_with_parts, set_up};
fn get_resolving_file_io() -> iceberg::io::FileIO {
set_up();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
FileIOBuilder::new(Arc::new(OpenDalResolvingStorageFactory::new()))
.with_props(vec![
- (S3_ENDPOINT, minio_endpoint),
+ (S3_ENDPOINT, object_store_endpoint),
(S3_ACCESS_KEY_ID, "admin".to_string()),
(S3_SECRET_ACCESS_KEY, "password".to_string()),
(S3_REGION, "us-east-1".to_string()),
@@ -268,9 +268,9 @@ mod tests {
use reqsign_core::Context;
#[derive(Debug)]
- struct MinioCredentialLoader;
+ struct ObjectStoreCredentialLoader;
- impl ProvideCredential for MinioCredentialLoader {
+ impl ProvideCredential for ObjectStoreCredentialLoader {
type Credential = AwsCredential;
async fn provide_credential(
@@ -287,14 +287,14 @@ mod tests {
}
set_up();
- let minio_endpoint = get_minio_endpoint();
+ let object_store_endpoint = get_object_store_endpoint();
let factory = OpenDalResolvingStorageFactory::new()
- .with_s3_credential_loader(CustomAwsCredentialLoader::new(MinioCredentialLoader));
+ .with_s3_credential_loader(CustomAwsCredentialLoader::new(ObjectStoreCredentialLoader));
let file_io = FileIOBuilder::new(Arc::new(factory))
.with_props(vec![
- (S3_ENDPOINT, minio_endpoint),
+ (S3_ENDPOINT, object_store_endpoint),
(S3_REGION, "us-east-1".to_string()),
(S3_PATH_STYLE_ACCESS, "true".to_string()),
])
diff --git a/crates/test_utils/src/lib.rs b/crates/test_utils/src/lib.rs
index e44d96c38..b64e46269 100644
--- a/crates/test_utils/src/lib.rs
+++ b/crates/test_utils/src/lib.rs
@@ -37,24 +37,24 @@ mod common {
}
// Environment variable names for service endpoints
- pub const ENV_MINIO_ENDPOINT: &str = "ICEBERG_TEST_MINIO_ENDPOINT";
+ pub const ENV_OBJECT_STORE_ENDPOINT: &str = "ICEBERG_TEST_OBJECT_STORE_ENDPOINT";
pub const ENV_REST_CATALOG_ENDPOINT: &str = "ICEBERG_TEST_REST_ENDPOINT";
pub const ENV_HMS_ENDPOINT: &str = "ICEBERG_TEST_HMS_ENDPOINT";
pub const ENV_GLUE_ENDPOINT: &str = "ICEBERG_TEST_GLUE_ENDPOINT";
pub const ENV_GCS_ENDPOINT: &str = "ICEBERG_TEST_GCS_ENDPOINT";
// Default ports matching dev/docker-compose.yaml
- pub const DEFAULT_MINIO_PORT: u16 = 9000;
+ pub const DEFAULT_OBJECT_STORE_PORT: u16 = 9000;
pub const DEFAULT_REST_CATALOG_PORT: u16 = 8181;
pub const DEFAULT_HMS_PORT: u16 = 9083;
pub const DEFAULT_GLUE_PORT: u16 = 5001;
pub const DEFAULT_GCS_PORT: u16 = 4443;
- /// Returns the MinIO S3-compatible endpoint.
- /// Checks ICEBERG_TEST_MINIO_ENDPOINT env var, otherwise returns localhost default.
- pub fn get_minio_endpoint() -> String {
- std::env::var(ENV_MINIO_ENDPOINT)
- .unwrap_or_else(|_| format!("http://localhost:{DEFAULT_MINIO_PORT}"))
+ /// Returns the S3-compatible object store endpoint.
+ /// Checks ICEBERG_TEST_OBJECT_STORE_ENDPOINT env var, otherwise returns localhost default.
+ pub fn get_object_store_endpoint() -> String {
+ std::env::var(ENV_OBJECT_STORE_ENDPOINT)
+ .unwrap_or_else(|_| format!("http://localhost:{DEFAULT_OBJECT_STORE_PORT}"))
}
/// Returns the REST catalog endpoint.
diff --git a/dev/docker-compose.yaml b/dev/docker-compose.yaml
index 16c999cb9..cb89e3042 100644
--- a/dev/docker-compose.yaml
+++ b/dev/docker-compose.yaml
@@ -25,53 +25,43 @@ networks:
services:
# =============================================================================
- # MinIO - S3-compatible storage (shared by all tests)
+ # Object store - S3-compatible storage backed by RustFS (shared by all tests)
# =============================================================================
- minio:
- image: quay.io/minio/minio:RELEASE.2025-05-24T17-08-30Z
+ object-store:
+ image: rustfs/rustfs:1.0.0
environment:
- - MINIO_ROOT_USER=admin
- - MINIO_ROOT_PASSWORD=password
- - MINIO_DOMAIN=minio
- hostname: minio
+ - RUSTFS_ACCESS_KEY=admin
+ - RUSTFS_SECRET_KEY=password
+ - RUSTFS_SERVER_DOMAINS=object-store
+ hostname: object-store
networks:
iceberg_test:
# Add aliases for virtual-hosted style bucket access
aliases:
- - icebergdata.minio
- - warehouse.minio
- - bucket1.minio
+ - icebergdata.object-store
+ - warehouse.object-store
+ - bucket1.object-store
ports:
- "9000:9000"
- "9001:9001"
- command: ["server", "/data", "--console-address", ":9001"]
healthcheck:
- test: ["CMD", "mc", "ready", "local"]
+ test: ["CMD", "curl", "-f", "http://localhost:9000/health/ready"]
interval: 5s
timeout: 5s
retries: 5
- # MinIO client - creates buckets for tests
- mc:
+ # One-shot job that creates buckets for tests. Re-creating an existing bucket
+ # returns 200, so this is safe to re-run.
+ create-buckets:
depends_on:
- minio:
+ object-store:
condition: service_healthy
- image: quay.io/minio/mc:RELEASE.2025-05-21T01-59-54Z
- environment:
- - AWS_ACCESS_KEY_ID=admin
- - AWS_SECRET_ACCESS_KEY=password
- - AWS_REGION=us-east-1
+ image: rustfs/rustfs:1.0.0
entrypoint: >
/bin/sh -c "
- /usr/bin/mc alias set minio http://minio:9000 admin password;
- /usr/bin/mc mb --ignore-existing minio/icebergdata;
- /usr/bin/mc mb --ignore-existing minio/warehouse;
- /usr/bin/mc mb --ignore-existing minio/bucket1;
- /usr/bin/mc policy set public minio/icebergdata;
- /usr/bin/mc policy set public minio/warehouse;
- /usr/bin/mc policy set public minio/bucket1;
- echo 'Buckets created successfully';
- tail -f /dev/null
+ curl -fsS --aws-sigv4 aws:amz:us-east-1:s3 -u admin:password -X PUT http://object-store:9000/icebergdata &&
+ curl -fsS --aws-sigv4 aws:amz:us-east-1:s3 -u admin:password -X PUT http://object-store:9000/warehouse &&
+ curl -fsS --aws-sigv4 aws:amz:us-east-1:s3 -u admin:password -X PUT http://object-store:9000/bucket1
"
networks:
iceberg_test:
@@ -89,9 +79,9 @@ services:
- CATALOG_URI=jdbc:sqlite:file:/tmp/iceberg_rest.db?journal_mode=WAL
- CATALOG_WAREHOUSE=s3://icebergdata/demo
- CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
- - CATALOG_S3_ENDPOINT=http://minio:9000
+ - CATALOG_S3_ENDPOINT=http://object-store:9000
depends_on:
- minio:
+ object-store:
condition: service_healthy
networks:
iceberg_test:
@@ -113,7 +103,7 @@ services:
dockerfile: Dockerfile
platform: ${DOCKER_DEFAULT_PLATFORM:-linux/amd64}
depends_on:
- minio:
+ object-store:
condition: service_healthy
networks:
iceberg_test:
@@ -170,8 +160,8 @@ services:
depends_on:
rest:
condition: service_healthy
- minio:
- condition: service_healthy
+ create-buckets:
+ condition: service_completed_successfully
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
diff --git a/dev/hms/core-site.xml b/dev/hms/core-site.xml
index f23efa888..d88ef9357 100644
--- a/dev/hms/core-site.xml
+++ b/dev/hms/core-site.xml
@@ -30,7 +30,7 @@
</property>
<property>
<name>fs.s3a.endpoint</name>
- <value>http://minio:9000</value>
+ <value>http://object-store:9000</value>
</property>
<property>
<name>fs.s3a.access.key</name>
diff --git a/dev/spark/spark-defaults.conf b/dev/spark/spark-defaults.conf
index b576f624b..a02640bbd 100644
--- a/dev/spark/spark-defaults.conf
+++ b/dev/spark/spark-defaults.conf
@@ -23,7 +23,7 @@ spark.sql.catalog.rest.type rest
spark.sql.catalog.rest.uri http://rest:8181
spark.sql.catalog.rest.io-impl org.apache.iceberg.aws.s3.S3FileIO
spark.sql.catalog.rest.warehouse s3://warehouse/rest/
-spark.sql.catalog.rest.s3.endpoint http://minio:9000
+spark.sql.catalog.rest.s3.endpoint http://object-store:9000
spark.sql.catalog.rest.cache-enabled false
spark.sql.defaultCatalog rest
diff --git a/website/src/reference/container-runtimes.md b/website/src/reference/container-runtimes.md
index 7b4ac3851..412aa7005 100644
--- a/website/src/reference/container-runtimes.md
+++ b/website/src/reference/container-runtimes.md
@@ -19,7 +19,7 @@
# Container Runtimes
-Iceberg-rust uses containers for integration tests, where `docker` and `docker compose` start containers for MinIO and various catalogs. You can use any of the following container runtimes.
+Iceberg-rust uses containers for integration tests, where `docker` and `docker compose` start containers for an S3-compatible object store (RustFS) and various catalogs. You can use any of the following container runtimes.
## Docker Desktop