From 0d977b6f009aded9ffda91e2d58137c2158712f7 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:00:27 +0100 Subject: [PATCH 01/12] chore(go): bump to Go1.25 --- .devcontainer/devcontainer.json | 2 +- .github/workflows/ci-test-go.yml | 2 +- .github/workflows/ci.yml | 8 ++++---- AI.md | 10 +++++----- docs/system_requirements/ci/aws_codebuild.md | 2 +- docs/system_requirements/ci/circle_ci.md | 2 +- docs/system_requirements/ci/concourse_ci.md | 2 +- docs/system_requirements/ci/dind_patterns.md | 4 ++-- docs/system_requirements/ci/gitlab_ci.md | 2 +- docs/system_requirements/ci/tekton.md | 2 +- examples/nginx/go.mod | 4 ++-- go.mod | 4 ++-- modulegen/go.mod | 4 ++-- modules/aerospike/go.mod | 4 ++-- modules/arangodb/go.mod | 4 ++-- modules/artemis/go.mod | 4 ++-- modules/azure/go.mod | 4 ++-- modules/azure/lowkeyvault/testdata/go.mod | 4 ++-- modules/azurite/go.mod | 4 ++-- modules/cassandra/go.mod | 4 ++-- modules/chroma/go.mod | 2 +- modules/clickhouse/go.mod | 4 ++-- modules/cockroachdb/go.mod | 4 ++-- modules/consul/go.mod | 4 ++-- modules/couchbase/go.mod | 4 ++-- modules/databend/go.mod | 4 ++-- modules/dind/go.mod | 4 ++-- modules/dockermcpgateway/go.mod | 4 ++-- modules/dockermodelrunner/go.mod | 4 ++-- modules/dolt/go.mod | 4 ++-- modules/dynamodb/go.mod | 4 ++-- modules/elasticsearch/go.mod | 4 ++-- modules/etcd/go.mod | 4 ++-- modules/gcloud/go.mod | 4 ++-- modules/grafana-lgtm/go.mod | 4 ++-- modules/inbucket/go.mod | 4 ++-- modules/influxdb/go.mod | 4 ++-- modules/k3s/go.mod | 4 ++-- modules/k6/go.mod | 4 ++-- modules/kafka/go.mod | 4 ++-- modules/localstack/go.mod | 4 ++-- modules/mariadb/go.mod | 4 ++-- modules/meilisearch/go.mod | 4 ++-- modules/memcached/go.mod | 4 ++-- modules/milvus/go.mod | 4 ++-- modules/minio/go.mod | 4 ++-- modules/mockserver/go.mod | 4 ++-- modules/mongodb/go.mod | 4 ++-- modules/mssql/go.mod | 4 ++-- modules/mysql/go.mod | 4 ++-- modules/nats/go.mod | 4 ++-- modules/nebulagraph/go.mod | 4 ++-- modules/neo4j/go.mod | 4 ++-- modules/ollama/go.mod | 4 ++-- modules/openfga/go.mod | 4 ++-- modules/openldap/go.mod | 4 ++-- modules/opensearch/go.mod | 4 ++-- modules/pinecone/go.mod | 4 ++-- modules/postgres/go.mod | 4 ++-- modules/pulsar/go.mod | 4 ++-- modules/qdrant/go.mod | 4 ++-- modules/rabbitmq/go.mod | 4 ++-- modules/redis/go.mod | 4 ++-- modules/redpanda/go.mod | 4 ++-- modules/registry/go.mod | 4 ++-- modules/scylladb/go.mod | 4 ++-- modules/socat/go.mod | 4 ++-- modules/solace/go.mod | 4 ++-- modules/surrealdb/go.mod | 4 ++-- modules/toxiproxy/go.mod | 4 ++-- modules/valkey/go.mod | 4 ++-- modules/vault/go.mod | 4 ++-- modules/vearch/go.mod | 4 ++-- modules/weaviate/go.mod | 4 ++-- modules/yugabytedb/go.mod | 4 ++-- usage-metrics/go.mod | 4 ++-- wait/testdata/http/go.mod | 4 ++-- 77 files changed, 151 insertions(+), 151 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6610af70d0..2d0049f26b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/go { "name": "Go", - "image": "mcr.microsoft.com/devcontainers/go:1.24-trixie", + "image": "mcr.microsoft.com/devcontainers/go:1.25-trixie", // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, diff --git a/.github/workflows/ci-test-go.yml b/.github/workflows/ci-test-go.yml index 1a0a66d5cc..9a5b55e88a 100644 --- a/.github/workflows/ci-test-go.yml +++ b/.github/workflows/ci-test-go.yml @@ -143,7 +143,7 @@ jobs: - name: Decide if Sonar must be run if: ${{ steps.go-compat.outputs.compatible == 'true' && matrix.platform == 'ubuntu-latest' }} run: | - if [[ "1.24.x" == "${{ inputs.go-version }}" ]] && \ + if [[ "1.25.x" == "${{ inputs.go-version }}" ]] && \ [[ "true" != "${{ inputs.rootless-docker }}" ]] && \ [[ "true" != "${{ inputs.testcontainers-cloud }}" ]] && \ [[ "true" != "${{ inputs.ryuk-disabled }}" ]] && \ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c864a71ab..30a70e2e5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: # We don't want to fail the build the soonest but identify which modules passed and failed. fail-fast: false matrix: - go-version: [1.24.x, 1.25.x] + go-version: [1.25.x, 1.26.x] module: ${{ fromJSON(needs.detect-modules.outputs.modules) }} permissions: contents: read # for actions/checkout to fetch code @@ -88,7 +88,7 @@ jobs: # We don't want to fail the build the soonest but identify which modules passed and failed. fail-fast: false matrix: - go-version: [1.24.x, 1.25.x] + go-version: [1.25.x, 1.26.x] uses: ./.github/workflows/ci-test-go.yml with: go-version: ${{ matrix.go-version }} @@ -109,7 +109,7 @@ jobs: name: "Test with reaper off" strategy: matrix: - go-version: [1.24.x, 1.25.x] + go-version: [1.25.x, 1.26.x] uses: ./.github/workflows/ci-test-go.yml with: go-version: ${{ matrix.go-version }} @@ -130,7 +130,7 @@ jobs: name: "Test with Rootless Docker" strategy: matrix: - go-version: [1.24.x, 1.25.x] + go-version: [1.25.x, 1.26.x] uses: ./.github/workflows/ci-test-go.yml with: go-version: ${{ matrix.go-version }} diff --git a/AI.md b/AI.md index 9d1e91d321..c66a8c69b8 100644 --- a/AI.md +++ b/AI.md @@ -14,15 +14,15 @@ This is a **Go monorepo** containing: ## Environment Setup ### Go Version -- **Required**: Go 1.24.7 +- **Required**: Go 1.25.7 - **Tool**: Use [gvm](https://github.com/andrewkroh/gvm) for version management - **CRITICAL**: Always run this before ANY Go command: ```bash # For Apple Silicon (M1/M2/M3) - eval "$(gvm 1.24.7 --arch=arm64)" + eval "$(gvm 1.25.7 --arch=arm64)" # For Intel/AMD (x86_64) - eval "$(gvm 1.24.7 --arch=amd64)" + eval "$(gvm 1.25.7 --arch=amd64)" ``` ### Project Structure @@ -171,14 +171,14 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom ### When Tests Fail 1. **Read the error message carefully** - it usually tells you exactly what's wrong 2. **Check if it's a lint issue** - run `make pre-commit` first -3. **Verify Go version** - ensure using Go 1.24.7 +3. **Verify Go version** - ensure using Go 1.25.7 4. **Check Docker** - some tests require Docker daemon running ## Common Pitfalls to Avoid ### Code Issues - ❌ Using interface types as return values -- ❌ Forgetting to run `eval "$(gvm 1.24.7 --arch=arm64)"` +- ❌ Forgetting to run `eval "$(gvm 1.25.7 --arch=arm64)"` - ❌ Not handling errors from built-in options - ❌ Using module-specific container names (`PostgresContainer`) - ❌ Calling `.Customize()` method instead of direct function call diff --git a/docs/system_requirements/ci/aws_codebuild.md b/docs/system_requirements/ci/aws_codebuild.md index 67a001e450..0e4fede30b 100644 --- a/docs/system_requirements/ci/aws_codebuild.md +++ b/docs/system_requirements/ci/aws_codebuild.md @@ -11,7 +11,7 @@ version: 0.2 phases: install: runtime-versions: - golang: 1.24 + golang: 1.25 build: commands: - go test ./... diff --git a/docs/system_requirements/ci/circle_ci.md b/docs/system_requirements/ci/circle_ci.md index fab7f95f7d..a2be7b21a1 100644 --- a/docs/system_requirements/ci/circle_ci.md +++ b/docs/system_requirements/ci/circle_ci.md @@ -57,7 +57,7 @@ workflows: - tests: matrix: parameters: - go-version: ["1.24.7", "1.25.1"] + go-version: ["1.25.7", "1.26.1"] ``` diff --git a/docs/system_requirements/ci/concourse_ci.md b/docs/system_requirements/ci/concourse_ci.md index d461bfa5a0..adb6921cfa 100644 --- a/docs/system_requirements/ci/concourse_ci.md +++ b/docs/system_requirements/ci/concourse_ci.md @@ -36,7 +36,7 @@ jobs: start_docker cd repo - docker run -it --rm -v "$PWD:$PWD" -w "$PWD" -v /var/run/docker.sock:/var/run/docker.sock golang:1.24 go test ./... + docker run -it --rm -v "$PWD:$PWD" -w "$PWD" -v /var/run/docker.sock:/var/run/docker.sock golang:1.25 go test ./... ``` Finally, you can use Concourse's [fly CLI](https://concourse-ci.org/fly.html) to set the pipeline and trigger the job: diff --git a/docs/system_requirements/ci/dind_patterns.md b/docs/system_requirements/ci/dind_patterns.md index da4eed4e48..74245b07fc 100644 --- a/docs/system_requirements/ci/dind_patterns.md +++ b/docs/system_requirements/ci/dind_patterns.md @@ -24,7 +24,7 @@ $ tree . └── platform └── integration_test.go -$ docker run -it --rm -v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock golang:1.24 go test ./... -v +$ docker run -it --rm -v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock golang:1.25 go test ./... -v ``` Where: @@ -45,7 +45,7 @@ The same can be achieved with Docker Compose: ```yaml tests: - image: golang:1.24 + image: golang:1.25 stop_signal: SIGKILL stdin_open: true tty: true diff --git a/docs/system_requirements/ci/gitlab_ci.md b/docs/system_requirements/ci/gitlab_ci.md index 22e7431110..cf4cd7319d 100644 --- a/docs/system_requirements/ci/gitlab_ci.md +++ b/docs/system_requirements/ci/gitlab_ci.md @@ -57,7 +57,7 @@ variables: DOCKER_DRIVER: overlay2 test: - image: golang:1.24 + image: golang:1.25 stage: test script: go test ./... -v ``` diff --git a/docs/system_requirements/ci/tekton.md b/docs/system_requirements/ci/tekton.md index 3839356bc9..266abe76d8 100644 --- a/docs/system_requirements/ci/tekton.md +++ b/docs/system_requirements/ci/tekton.md @@ -16,7 +16,7 @@ spec: - name: source steps: - name: read - image: golang:1.24 + image: golang:1.25 workingDir: $(workspaces.source.path) script: go test ./... -v volumeMounts: diff --git a/examples/nginx/go.mod b/examples/nginx/go.mod index 1b5717ba21..f1c4ac061f 100644 --- a/examples/nginx/go.mod +++ b/examples/nginx/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/examples/nginx -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/go.mod b/go.mod index 101d2628f4..6013f2f01c 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( dario.cat/mergo v1.0.2 diff --git a/modulegen/go.mod b/modulegen/go.mod index e7c1020a1a..c4f0d8767e 100644 --- a/modulegen/go.mod +++ b/modulegen/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modulegen -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/spf13/cobra v1.10.2 diff --git a/modules/aerospike/go.mod b/modules/aerospike/go.mod index 848d0e131a..b28da954e1 100644 --- a/modules/aerospike/go.mod +++ b/modules/aerospike/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/aerospike -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/aerospike/aerospike-client-go/v8 v8.2.0 diff --git a/modules/arangodb/go.mod b/modules/arangodb/go.mod index 0af5bd50b1..9616ca38d9 100644 --- a/modules/arangodb/go.mod +++ b/modules/arangodb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/arangodb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/arangodb/go-driver/v2 v2.1.3 diff --git a/modules/artemis/go.mod b/modules/artemis/go.mod index a9e38ab911..ec73b1e874 100644 --- a/modules/artemis/go.mod +++ b/modules/artemis/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/artemis -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/go-connections v0.6.0 diff --git a/modules/azure/go.mod b/modules/azure/go.mod index 980dc62788..d5bb8effca 100644 --- a/modules/azure/go.mod +++ b/modules/azure/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/azure -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 diff --git a/modules/azure/lowkeyvault/testdata/go.mod b/modules/azure/lowkeyvault/testdata/go.mod index db119a2f1f..c909bec177 100644 --- a/modules/azure/lowkeyvault/testdata/go.mod +++ b/modules/azure/lowkeyvault/testdata/go.mod @@ -1,8 +1,8 @@ module lowkeyvault_network_test -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 diff --git a/modules/azurite/go.mod b/modules/azurite/go.mod index 79b6b92273..7031bd7102 100644 --- a/modules/azurite/go.mod +++ b/modules/azurite/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/azurite -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/modules/cassandra/go.mod b/modules/cassandra/go.mod index 152094a7a8..705c712487 100644 --- a/modules/cassandra/go.mod +++ b/modules/cassandra/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/cassandra -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/gocql/gocql v1.6.0 diff --git a/modules/chroma/go.mod b/modules/chroma/go.mod index 40bd939594..b25e1dcc24 100644 --- a/modules/chroma/go.mod +++ b/modules/chroma/go.mod @@ -1,6 +1,6 @@ module github.com/testcontainers/testcontainers-go/modules/chroma -go 1.24.11 +go 1.25.0 require ( github.com/amikos-tech/chroma-go v0.3.2 diff --git a/modules/clickhouse/go.mod b/modules/clickhouse/go.mod index ea85b90027..5ebf18ab2c 100644 --- a/modules/clickhouse/go.mod +++ b/modules/clickhouse/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/clickhouse -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/ClickHouse/clickhouse-go/v2 v2.34.0 diff --git a/modules/cockroachdb/go.mod b/modules/cockroachdb/go.mod index abb6cd713e..2bb28df0f0 100644 --- a/modules/cockroachdb/go.mod +++ b/modules/cockroachdb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/cockroachdb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/go-connections v0.6.0 diff --git a/modules/consul/go.mod b/modules/consul/go.mod index 3b14297217..0a75565da7 100644 --- a/modules/consul/go.mod +++ b/modules/consul/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/consul -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/hashicorp/consul/api v1.27.0 diff --git a/modules/couchbase/go.mod b/modules/couchbase/go.mod index 8c91bc2b18..13e13ca6a6 100644 --- a/modules/couchbase/go.mod +++ b/modules/couchbase/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/couchbase -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/cenkalti/backoff/v4 v4.3.0 diff --git a/modules/databend/go.mod b/modules/databend/go.mod index f4e97e7906..f3e2695dc8 100644 --- a/modules/databend/go.mod +++ b/modules/databend/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/databend -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/datafuselabs/databend-go v0.7.0 diff --git a/modules/dind/go.mod b/modules/dind/go.mod index d3757b97ea..af02f76473 100644 --- a/modules/dind/go.mod +++ b/modules/dind/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/dind -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/dockermcpgateway/go.mod b/modules/dockermcpgateway/go.mod index 693a34c635..bb50e3151b 100644 --- a/modules/dockermcpgateway/go.mod +++ b/modules/dockermcpgateway/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/dockermcpgateway -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/dockermodelrunner/go.mod b/modules/dockermodelrunner/go.mod index f605bc91bf..c2f8742468 100644 --- a/modules/dockermodelrunner/go.mod +++ b/modules/dockermodelrunner/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/dockermodelrunner -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/openai/openai-go v0.1.0-beta.9 diff --git a/modules/dolt/go.mod b/modules/dolt/go.mod index 65d8a32fa5..dd59f41f76 100644 --- a/modules/dolt/go.mod +++ b/modules/dolt/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/dolt -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/go-sql-driver/mysql v1.7.1 diff --git a/modules/dynamodb/go.mod b/modules/dynamodb/go.mod index 145205576b..eb5a395adc 100644 --- a/modules/dynamodb/go.mod +++ b/modules/dynamodb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/dynamodb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/aws/aws-sdk-go-v2 v1.31.0 diff --git a/modules/elasticsearch/go.mod b/modules/elasticsearch/go.mod index 086cf65876..1209019594 100644 --- a/modules/elasticsearch/go.mod +++ b/modules/elasticsearch/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/elasticsearch -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/elastic/go-elasticsearch/v8 v8.12.1 diff --git a/modules/etcd/go.mod b/modules/etcd/go.mod index 4fc30c6e4b..ddc5362ae3 100644 --- a/modules/etcd/go.mod +++ b/modules/etcd/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/etcd -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/containerd/errdefs v1.0.0 diff --git a/modules/gcloud/go.mod b/modules/gcloud/go.mod index 6b63711ccb..8225485d9f 100644 --- a/modules/gcloud/go.mod +++ b/modules/gcloud/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/gcloud -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( cloud.google.com/go/bigquery v1.59.1 diff --git a/modules/grafana-lgtm/go.mod b/modules/grafana-lgtm/go.mod index 70746b048f..85598dda2a 100644 --- a/modules/grafana-lgtm/go.mod +++ b/modules/grafana-lgtm/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/grafana-lgtm -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/modules/inbucket/go.mod b/modules/inbucket/go.mod index 55415067e8..14383041c8 100644 --- a/modules/inbucket/go.mod +++ b/modules/inbucket/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/inbucket -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/inbucket/inbucket v2.0.0+incompatible diff --git a/modules/influxdb/go.mod b/modules/influxdb/go.mod index 53c2d491dc..c57d6862e2 100644 --- a/modules/influxdb/go.mod +++ b/modules/influxdb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/influxdb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/influxdata/influxdb-client-go/v2 v2.14.0 diff --git a/modules/k3s/go.mod b/modules/k3s/go.mod index 946ab08cd7..0e004b37e8 100644 --- a/modules/k3s/go.mod +++ b/modules/k3s/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/k3s -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/k6/go.mod b/modules/k6/go.mod index 3fc7d040d4..86a203b091 100644 --- a/modules/k6/go.mod +++ b/modules/k6/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/k6 -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/kafka/go.mod b/modules/kafka/go.mod index 2b79fb6110..a6dbee4876 100644 --- a/modules/kafka/go.mod +++ b/modules/kafka/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/kafka -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/IBM/sarama v1.42.1 diff --git a/modules/localstack/go.mod b/modules/localstack/go.mod index 22506ed70c..526289ed73 100644 --- a/modules/localstack/go.mod +++ b/modules/localstack/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/localstack -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/aws/aws-sdk-go v1.50.31 diff --git a/modules/mariadb/go.mod b/modules/mariadb/go.mod index e103af69e0..68891cb074 100644 --- a/modules/mariadb/go.mod +++ b/modules/mariadb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/mariadb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/go-sql-driver/mysql v1.7.1 diff --git a/modules/meilisearch/go.mod b/modules/meilisearch/go.mod index 406a530d5f..5704f09ea9 100644 --- a/modules/meilisearch/go.mod +++ b/modules/meilisearch/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/meilisearch -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/modules/memcached/go.mod b/modules/memcached/go.mod index e20e9d4905..59fdd5fad6 100644 --- a/modules/memcached/go.mod +++ b/modules/memcached/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/memcached -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf diff --git a/modules/milvus/go.mod b/modules/milvus/go.mod index 7c6fa3096b..211e1e6005 100644 --- a/modules/milvus/go.mod +++ b/modules/milvus/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/milvus -go 1.24.4 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/milvus-io/milvus/client/v2 v2.6.0 diff --git a/modules/minio/go.mod b/modules/minio/go.mod index 4c19836293..72d857443b 100644 --- a/modules/minio/go.mod +++ b/modules/minio/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/minio -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/minio/minio-go/v7 v7.0.68 diff --git a/modules/mockserver/go.mod b/modules/mockserver/go.mod index fe056ce1db..fc74e2dab1 100644 --- a/modules/mockserver/go.mod +++ b/modules/mockserver/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/mockserver -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/BraspagDevelopers/mock-server-client v0.2.2 diff --git a/modules/mongodb/go.mod b/modules/mongodb/go.mod index f5e5e65571..ebf6303586 100644 --- a/modules/mongodb/go.mod +++ b/modules/mongodb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/mongodb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/modules/mssql/go.mod b/modules/mssql/go.mod index d7d2558d2b..c0596bb4ca 100644 --- a/modules/mssql/go.mod +++ b/modules/mssql/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/mssql -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/microsoft/go-mssqldb v1.7.0 diff --git a/modules/mysql/go.mod b/modules/mysql/go.mod index 10076a4814..dd72c40a66 100644 --- a/modules/mysql/go.mod +++ b/modules/mysql/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/mysql -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/go-sql-driver/mysql v1.7.1 diff --git a/modules/nats/go.mod b/modules/nats/go.mod index 49f4eab0f4..746472cb42 100644 --- a/modules/nats/go.mod +++ b/modules/nats/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/nats -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/nats-io/nats.go v1.33.1 diff --git a/modules/nebulagraph/go.mod b/modules/nebulagraph/go.mod index a16088b85c..889b0272b0 100644 --- a/modules/nebulagraph/go.mod +++ b/modules/nebulagraph/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/nebulagraph -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/jolestar/go-commons-pool v2.0.0+incompatible diff --git a/modules/neo4j/go.mod b/modules/neo4j/go.mod index 5bf3057302..3266e8620b 100644 --- a/modules/neo4j/go.mod +++ b/modules/neo4j/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/neo4j -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/neo4j/neo4j-go-driver/v5 v5.18.0 diff --git a/modules/ollama/go.mod b/modules/ollama/go.mod index 227d4c5329..7eed667585 100644 --- a/modules/ollama/go.mod +++ b/modules/ollama/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/ollama -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/containerd/errdefs v1.0.0 diff --git a/modules/openfga/go.mod b/modules/openfga/go.mod index 9d135db94a..d77bfe0f25 100644 --- a/modules/openfga/go.mod +++ b/modules/openfga/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/openfga -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/openfga/go-sdk v0.3.5 diff --git a/modules/openldap/go.mod b/modules/openldap/go.mod index fbc86d2cf1..dc04228078 100644 --- a/modules/openldap/go.mod +++ b/modules/openldap/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/openldap -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/go-ldap/ldap/v3 v3.4.6 diff --git a/modules/opensearch/go.mod b/modules/opensearch/go.mod index 199e75930e..761043635b 100644 --- a/modules/opensearch/go.mod +++ b/modules/opensearch/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/opensearch -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/pinecone/go.mod b/modules/pinecone/go.mod index d217fff1e3..138b4fe145 100644 --- a/modules/pinecone/go.mod +++ b/modules/pinecone/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/pinecone -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/pinecone-io/go-pinecone/v2 v2.2.0 diff --git a/modules/postgres/go.mod b/modules/postgres/go.mod index 593633f50a..d09417925a 100644 --- a/modules/postgres/go.mod +++ b/modules/postgres/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/postgres -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/go-connections v0.6.0 diff --git a/modules/pulsar/go.mod b/modules/pulsar/go.mod index 99fc9ea44a..2c7c74de2a 100644 --- a/modules/pulsar/go.mod +++ b/modules/pulsar/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/pulsar -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/apache/pulsar-client-go v0.14.0 diff --git a/modules/qdrant/go.mod b/modules/qdrant/go.mod index 2b46dbb58d..c74e731d0e 100644 --- a/modules/qdrant/go.mod +++ b/modules/qdrant/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/qdrant -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/qdrant/go-client v1.7.0 diff --git a/modules/rabbitmq/go.mod b/modules/rabbitmq/go.mod index 6219ae618d..fd48f7492b 100644 --- a/modules/rabbitmq/go.mod +++ b/modules/rabbitmq/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/rabbitmq -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/go-connections v0.6.0 diff --git a/modules/redis/go.mod b/modules/redis/go.mod index d2979f7ef4..55e63d71e9 100644 --- a/modules/redis/go.mod +++ b/modules/redis/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/redis -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/google/uuid v1.6.0 diff --git a/modules/redpanda/go.mod b/modules/redpanda/go.mod index 55b1c67269..c623620bf2 100644 --- a/modules/redpanda/go.mod +++ b/modules/redpanda/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/redpanda -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/registry/go.mod b/modules/registry/go.mod index 7e4041dfc7..f528f64805 100644 --- a/modules/registry/go.mod +++ b/modules/registry/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/registry -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/cpuguy83/dockercfg v0.3.2 diff --git a/modules/scylladb/go.mod b/modules/scylladb/go.mod index 71b92cf303..5697747e3b 100644 --- a/modules/scylladb/go.mod +++ b/modules/scylladb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/scylladb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/aws/aws-sdk-go-v2 v1.32.5 diff --git a/modules/socat/go.mod b/modules/socat/go.mod index ce0f04f025..9e0aaa086b 100644 --- a/modules/socat/go.mod +++ b/modules/socat/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/socat -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/go-connections v0.6.0 diff --git a/modules/solace/go.mod b/modules/solace/go.mod index d20beec919..66c34d9e9f 100644 --- a/modules/solace/go.mod +++ b/modules/solace/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/solace -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/surrealdb/go.mod b/modules/surrealdb/go.mod index 5f17c65b6b..853b85e266 100644 --- a/modules/surrealdb/go.mod +++ b/modules/surrealdb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/surrealdb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/modules/toxiproxy/go.mod b/modules/toxiproxy/go.mod index 8f2494b632..6d2170adfa 100644 --- a/modules/toxiproxy/go.mod +++ b/modules/toxiproxy/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/toxiproxy -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/Shopify/toxiproxy/v2 v2.12.0 diff --git a/modules/valkey/go.mod b/modules/valkey/go.mod index eae10acb6e..278c709e2c 100644 --- a/modules/valkey/go.mod +++ b/modules/valkey/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/valkey -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/google/uuid v1.6.0 diff --git a/modules/vault/go.mod b/modules/vault/go.mod index abc9ed8257..3b644f1f38 100644 --- a/modules/vault/go.mod +++ b/modules/vault/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/vault -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/vearch/go.mod b/modules/vearch/go.mod index 025c627718..829f5e30a7 100644 --- a/modules/vearch/go.mod +++ b/modules/vearch/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/vearch -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/docker/docker v28.5.2+incompatible diff --git a/modules/weaviate/go.mod b/modules/weaviate/go.mod index 58c24104e7..bcc5f380cc 100644 --- a/modules/weaviate/go.mod +++ b/modules/weaviate/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/weaviate -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/stretchr/testify v1.11.1 diff --git a/modules/yugabytedb/go.mod b/modules/yugabytedb/go.mod index 3aa979146a..94d177f80d 100644 --- a/modules/yugabytedb/go.mod +++ b/modules/yugabytedb/go.mod @@ -1,8 +1,8 @@ module github.com/testcontainers/testcontainers-go/modules/yugabytedb -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 require ( github.com/lib/pq v1.10.9 diff --git a/usage-metrics/go.mod b/usage-metrics/go.mod index 9991a98da6..c5dabd1e2a 100644 --- a/usage-metrics/go.mod +++ b/usage-metrics/go.mod @@ -1,5 +1,5 @@ module github.com/testcontainers/testcontainers-go/usage-metrics -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 diff --git a/wait/testdata/http/go.mod b/wait/testdata/http/go.mod index 19aa73e475..1f75bd77e2 100644 --- a/wait/testdata/http/go.mod +++ b/wait/testdata/http/go.mod @@ -1,5 +1,5 @@ module httptest -go 1.24.0 +go 1.25.0 -toolchain go1.24.7 +toolchain go1.25.7 From 8a17fc3547bbc7c2debc38b1ef97ea3840c07e1f Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:01:18 +0100 Subject: [PATCH 02/12] fix: deprecation comments --- container.go | 3 ++- reaper.go | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/container.go b/container.go index b0f2273a30..49c421a7d0 100644 --- a/container.go +++ b/container.go @@ -28,8 +28,9 @@ import ( "github.com/testcontainers/testcontainers-go/wait" ) +// Deprecated: Use [Container] +// // DeprecatedContainer shows methods that were supported before, but are now deprecated -// Deprecated: Use Container type DeprecatedContainer interface { GetHostEndpoint(ctx context.Context, port string) (string, string, error) GetIPAddress(ctx context.Context) (string, error) diff --git a/reaper.go b/reaper.go index 4e46f0e381..4f5c555e56 100644 --- a/reaper.go +++ b/reaper.go @@ -64,10 +64,11 @@ type ReaperProvider interface { Config() TestcontainersConfig } -// NewReaper creates a Reaper with a sessionID to identify containers and a provider to use // Deprecated: it's not possible to create a reaper any more. Compose module uses this method // to create a reaper for the compose stack. // +// # NewReaper creates a Reaper with a sessionID to identify containers and a provider to use +// // The caller must call Connect at least once on the returned Reaper and use the returned // result otherwise the reaper will be kept open until the process exits. func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider, _ string) (*Reaper, error) { @@ -568,8 +569,9 @@ func (r *Reaper) handshake(conn net.Conn) error { return nil } -// Labels returns the container labels to use so that this Reaper cleans them up // Deprecated: internally replaced by core.DefaultLabels(sessionID) +// +// Labels returns the container labels to use so that this Reaper cleans them up func (r *Reaper) Labels() map[string]string { return GenericLabels() } From b797fbcc5d233980b864a043c1c287b70b2505aa Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:27:07 +0100 Subject: [PATCH 03/12] chore(ci): remove go version exclusions --- .github/workflows/ci-lint-go.yml | 27 +---------------------- .github/workflows/ci-test-go.yml | 37 ++++++-------------------------- commons-test.mk | 2 +- 3 files changed, 8 insertions(+), 58 deletions(-) diff --git a/.github/workflows/ci-lint-go.yml b/.github/workflows/ci-lint-go.yml index cb047973df..df30034063 100644 --- a/.github/workflows/ci-lint-go.yml +++ b/.github/workflows/ci-lint-go.yml @@ -30,35 +30,10 @@ jobs: cache-dependency-path: "${{ inputs.project-directory == '' && '.' || inputs.project-directory }}/go.sum" id: go - - name: Determine golangci-lint version - id: linter-version - working-directory: ./${{ inputs.project-directory == '' && '.' || inputs.project-directory }} - shell: bash - run: | - # golangci-lint must be built with a Go version >= the module's go directive. - MODULE_GO_VERSION=$(grep '^go ' go.mod | awk '{print $2}') - MODULE_MAJOR_MINOR=$(echo "${MODULE_GO_VERSION}" | grep -oE '^[0-9]+\.[0-9]+') - - case "${MODULE_MAJOR_MINOR}" in - 1.24) - LINTER_VERSION=v2.0.2 - ;; - 1.25) - LINTER_VERSION=v2.9.0 - ;; - *) - echo "::error::No golangci-lint version mapped for Go ${MODULE_GO_VERSION}. Please update ci-lint-go.yml." - exit 1 - ;; - esac - - echo "version=${LINTER_VERSION}" >> "$GITHUB_OUTPUT" - echo "Module requires Go ${MODULE_GO_VERSION}, using golangci-lint ${LINTER_VERSION}" - - name: golangci-lint uses: golangci/golangci-lint-action@1481404843c368bc19ca9406f87d6e0fc97bdcfd # v7.0.0 with: - version: ${{ steps.linter-version.outputs.version }} + version: v2.9.0 # Optional: working directory, useful for monorepos working-directory: ${{ inputs.project-directory }} diff --git a/.github/workflows/ci-test-go.yml b/.github/workflows/ci-test-go.yml index 9a5b55e88a..291341a624 100644 --- a/.github/workflows/ci-test-go.yml +++ b/.github/workflows/ci-test-go.yml @@ -72,34 +72,11 @@ jobs: cache-dependency-path: '${{ inputs.project-directory }}/go.sum' id: go - - name: Check Go version compatibility - id: go-compat - working-directory: ./${{ inputs.project-directory == '' && '.' || inputs.project-directory }} - shell: bash - run: | - # Read the minimum Go version required by the module - MODULE_GO_VERSION=$(grep '^go ' go.mod | awk '{print $2}') - RUNNER_GO_VERSION=$(go env GOVERSION | sed 's/^go//') - echo "Module requires Go ${MODULE_GO_VERSION}, runner has Go ${RUNNER_GO_VERSION}" - - # Extract major.minor for comparison - MODULE_MAJOR_MINOR=$(echo "${MODULE_GO_VERSION}" | grep -oE '^[0-9]+\.[0-9]+') - RUNNER_MAJOR_MINOR=$(echo "${RUNNER_GO_VERSION}" | grep -oE '^[0-9]+\.[0-9]+') - - if [ "$(printf '%s\n' "${MODULE_MAJOR_MINOR}" "${RUNNER_MAJOR_MINOR}" | sort -V | head -n1)" = "${MODULE_MAJOR_MINOR}" ]; then - echo "compatible=true" >> $GITHUB_OUTPUT - else - echo "compatible=false" >> $GITHUB_OUTPUT - echo "::warning::Skipping tests: module requires Go ${MODULE_GO_VERSION} but runner has Go ${RUNNER_GO_VERSION}" - fi - - name: ensure compilation - if: steps.go-compat.outputs.compatible == 'true' working-directory: ./${{ inputs.project-directory }} run: go build ./... - name: Install dependencies - if: steps.go-compat.outputs.compatible == 'true' shell: bash run: | SCRIPT_PATH="./.github/scripts/${{ inputs.project-directory }}/install-dependencies.sh" @@ -111,25 +88,23 @@ jobs: # Setup Testcontainers Cloud Client right before your Testcontainers tests - name: Setup Testcontainers Cloud Client - if: ${{ steps.go-compat.outputs.compatible == 'true' && inputs.testcontainers-cloud }} + if: ${{ inputs.testcontainers-cloud }} uses: atomicjar/testcontainers-cloud-setup-action@c335bdbb570ec7c48f72c7d450c077f0a002293e # v1.3 with: token: ${{ secrets.TCC_TOKEN }} - name: go test - if: steps.go-compat.outputs.compatible == 'true' working-directory: ./${{ inputs.project-directory }} timeout-minutes: 30 run: make test-unit - name: Run checker - if: steps.go-compat.outputs.compatible == 'true' run: | ./scripts/check_environment.sh # (Optionally) When you don't need Testcontainers Cloud anymore, you could terminate sessions eagerly - name: Terminate Testcontainers Cloud Client active sessions - if: ${{ steps.go-compat.outputs.compatible == 'true' && inputs.testcontainers-cloud }} + if: ${{ inputs.testcontainers-cloud }} uses: atomicjar/testcontainers-cloud-setup-action@c335bdbb570ec7c48f72c7d450c077f0a002293e # v1.3 with: action: terminate @@ -138,10 +113,10 @@ jobs: uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "**/${{ inputs.project-directory }}/TEST-unit*.xml" - if: ${{ always() && steps.go-compat.outputs.compatible == 'true' }} + if: always() - name: Decide if Sonar must be run - if: ${{ steps.go-compat.outputs.compatible == 'true' && matrix.platform == 'ubuntu-latest' }} + if: ${{ matrix.platform == 'ubuntu-latest' }} run: | if [[ "1.25.x" == "${{ inputs.go-version }}" ]] && \ [[ "true" != "${{ inputs.rootless-docker }}" ]] && \ @@ -153,7 +128,7 @@ jobs: fi - name: Set Sonar Cloud environment variables - if: ${{ steps.go-compat.outputs.compatible == 'true' && env.SHOULD_RUN_SONAR == 'true' }} + if: ${{ env.SHOULD_RUN_SONAR == 'true' }} run: | echo "PROJECT_VERSION=$(grep 'latest_version' mkdocs.yml | cut -d':' -f2 | tr -d ' ')" >> $GITHUB_ENV if [ "${{ inputs.project-directory }}" == "" ]; then @@ -169,7 +144,7 @@ jobs: fi - name: SonarQube Scan - if: ${{ steps.go-compat.outputs.compatible == 'true' && env.SHOULD_RUN_SONAR == 'true' }} + if: ${{ env.SHOULD_RUN_SONAR == 'true' }} uses: SonarSource/sonarqube-scan-action@aa494459d7c39c106cc77b166de8b4250a32bb97 # v5.1.0 env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/commons-test.mk b/commons-test.mk index 10adfad8d4..bb86a9fab4 100644 --- a/commons-test.mk +++ b/commons-test.mk @@ -6,7 +6,7 @@ define go_install endef $(GOBIN)/golangci-lint: - $(call go_install,github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.0.2) + $(call go_install,github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.9.0) $(GOBIN)/gotestsum: $(call go_install,gotest.tools/gotestsum@latest) From dab311623d8709f13ecc0180957c02e89ab11708 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:28:10 +0100 Subject: [PATCH 04/12] fix: lint --- .golangci.yml | 9 +++++++++ network/network_test.go | 9 +++++---- options.go | 2 +- port_forwarding.go | 6 +++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 05ecd658eb..886bb4a50c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -23,6 +23,15 @@ linters: - thelper - usestdlibvars exclusions: + rules: + - linters: + - revive + path: "^exec/" + text: "var-naming: avoid package names that conflict with Go standard library package names" + - linters: + - revive + path: "^log/" + text: "var-naming: avoid package names that conflict with Go standard library package names" presets: - comments - common-false-positives diff --git a/network/network_test.go b/network/network_test.go index c11665bd09..314ec60a6f 100644 --- a/network/network_test.go +++ b/network/network_test.go @@ -134,17 +134,18 @@ func TestContainerWithReaperNetwork(t *testing.T) { } ctx := context.Background() - networks := []string{} - maxNetworksCount := 2 - opts := []testcontainers.ContainerCustomizer{ + networks := make([]string, 0, maxNetworksCount) + + opts := make([]testcontainers.ContainerCustomizer, 0, 2+maxNetworksCount) + opts = append(opts, testcontainers.WithExposedPorts(nginxDefaultPort), testcontainers.WithWaitStrategy( wait.ForListeningPort(nginxDefaultPort), wait.ForLog("Configuration complete; ready for start up"), ), - } + ) for range maxNetworksCount { n, err := network.New(ctx) diff --git a/options.go b/options.go index 007eaa774e..6e5f455d87 100644 --- a/options.go +++ b/options.go @@ -343,7 +343,7 @@ func WithStartupCommand(execs ...Executable) CustomizeRequestOption { // is ready. func WithAfterReadyCommand(execs ...Executable) CustomizeRequestOption { return func(req *GenericContainerRequest) error { - postReadiesHook := []ContainerHook{} + postReadiesHook := make([]ContainerHook, 0, len(execs)) for _, exec := range execs { execFn := func(ctx context.Context, c Container) error { diff --git a/port_forwarding.go b/port_forwarding.go index 9d4ec10f9a..6a3c623864 100644 --- a/port_forwarding.go +++ b/port_forwarding.go @@ -177,12 +177,12 @@ func exposeHostPorts(ctx context.Context, req *ContainerRequest, ports ...int) ( // newSshdContainer creates a new SSHD container with the provided options. func newSshdContainer(ctx context.Context, opts ...ContainerCustomizer) (*sshdContainer, error) { - moduleOpts := []ContainerCustomizer{ + moduleOpts := make([]ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, WithExposedPorts(sshPort), WithEnv(map[string]string{"PASSWORD": sshPassword}), WithWaitStrategy(wait.ForListeningPort(sshPort)), - } - + ) moduleOpts = append(moduleOpts, opts...) c, err := Run(ctx, sshdImage, moduleOpts...) From 85408daca205cb2c7ff90a8eb70cf72b885326e6 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:44:04 +0100 Subject: [PATCH 05/12] fix(model-runner): lint --- modules/dockermodelrunner/dockermodelrunner_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/dockermodelrunner/dockermodelrunner_test.go b/modules/dockermodelrunner/dockermodelrunner_test.go index 577df45996..da38863680 100644 --- a/modules/dockermodelrunner/dockermodelrunner_test.go +++ b/modules/dockermodelrunner/dockermodelrunner_test.go @@ -98,7 +98,7 @@ func TestRun_client(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, models) - allTags := []string{} + allTags := make([]string, 0, len(models)) for _, model := range models { allTags = append(allTags, model.Tags...) } From 85d71d7e6d291478f7724ab9a5e3c19c45ad3f40 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:45:45 +0100 Subject: [PATCH 06/12] fix(lint): exclude modulegen internal packages --- .golangci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.golangci.yml b/.golangci.yml index 886bb4a50c..f05e2f95a2 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -32,6 +32,10 @@ linters: - revive path: "^log/" text: "var-naming: avoid package names that conflict with Go standard library package names" + - linters: + - revive + path: "modulegen/internal/(context|template)/" + text: "var-naming: avoid package names that conflict with Go standard library package names" presets: - comments - common-false-positives From 50758261b6b84bc32e8fb57be6d7b7d8fa6ecc9e Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:52:26 +0100 Subject: [PATCH 07/12] fix(lint): exclude more internal packages --- .golangci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.golangci.yml b/.golangci.yml index f05e2f95a2..0afeb4e2dd 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -36,6 +36,10 @@ linters: - revive path: "modulegen/internal/(context|template)/" text: "var-naming: avoid package names that conflict with Go standard library package names" + - linters: + - revive + path: "internal/sdk/types/" + text: "var-naming: avoid meaningless package names" presets: - comments - common-false-positives From df84bc78b8de216cbd73188ceea2b453e553397c Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:54:37 +0100 Subject: [PATCH 08/12] fix: lint --- modules/aerospike/aerospike.go | 5 +++-- modules/arangodb/arangodb.go | 5 +++-- modules/artemis/artemis.go | 5 +++-- modules/azure/cosmosdb/cosmosdb.go | 5 +++-- modules/azure/eventhubs/eventhubs.go | 5 +++-- modules/azure/lowkeyvault/lowkeyvault.go | 5 +++-- modules/azure/servicebus/servicebus.go | 6 +++--- modules/chroma/chroma.go | 5 +++-- modules/clickhouse/clickhouse.go | 5 +++-- modules/clickhouse/options.go | 2 +- modules/cockroachdb/cockroachdb.go | 6 +++--- modules/compose/compose_api.go | 2 +- modules/consul/consul.go | 5 +++-- modules/couchbase/couchbase.go | 11 ++++++---- modules/couchbase/options.go | 2 ++ modules/databend/databend.go | 5 +++-- modules/dind/dind.go | 5 +++-- modules/dockermcpgateway/dockermcpgateway.go | 4 +++- modules/dolt/dolt.go | 5 +++-- modules/dynamodb/dynamodb.go | 5 +++-- modules/elasticsearch/elasticsearch.go | 5 +++-- modules/grafana-lgtm/grafana.go | 5 +++-- modules/inbucket/inbucket.go | 5 +++-- modules/influxdb/influxdb.go | 5 +++-- modules/k3s/k3s.go | 5 +++-- modules/k6/k6.go | 5 +++-- modules/kafka/kafka.go | 5 +++-- modules/localstack/localstack.go | 8 ++++--- modules/mariadb/mariadb.go | 5 +++-- modules/memcached/memcached.go | 5 +++-- modules/milvus/milvus.go | 6 +++--- modules/mockserver/mockserver.go | 5 +++-- modules/mongodb/atlaslocal/atlaslocal.go | 5 +++-- modules/mongodb/atlaslocal/atlaslocal_test.go | 6 ++---- modules/mongodb/mongodb.go | 5 +++-- modules/nats/nats.go | 2 +- modules/nebulagraph/nebulagraph.go | 9 +++++--- modules/neo4j/neo4j.go | 5 +++-- modules/ollama/ollama.go | 7 ++++--- modules/openfga/openfga.go | 5 +++-- modules/openldap/openldap.go | 5 +++-- modules/opensearch/opensearch.go | 6 +++--- modules/pinecone/pinecone.go | 5 +++-- modules/postgres/postgres.go | 9 ++++---- modules/pulsar/pulsar.go | 21 ++++++++----------- modules/qdrant/qdrant.go | 5 +++-- modules/scylladb/scylladb.go | 5 +++-- modules/solace/solace.go | 5 +++-- modules/weaviate/weaviate_test.go | 3 +-- 49 files changed, 155 insertions(+), 115 deletions(-) diff --git a/modules/aerospike/aerospike.go b/modules/aerospike/aerospike.go index f96b63ee23..585b3b5348 100644 --- a/modules/aerospike/aerospike.go +++ b/modules/aerospike/aerospike.go @@ -29,7 +29,8 @@ type Container struct { // Run creates an instance of the Aerospike container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(port, fabricPort, heartbeatPort, infoPort), testcontainers.WithEnv(map[string]string{ "AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf", @@ -40,7 +41,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom wait.ForListeningPort(fabricPort).WithStartupTimeout(10*time.Second), wait.ForListeningPort(heartbeatPort).WithStartupTimeout(10*time.Second), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/arangodb/arangodb.go b/modules/arangodb/arangodb.go index 23ca16435d..f190ee45d9 100644 --- a/modules/arangodb/arangodb.go +++ b/modules/arangodb/arangodb.go @@ -43,13 +43,14 @@ func (c *Container) HTTPEndpoint(ctx context.Context) (string, error) { // Run creates an instance of the ArangoDB container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)+1) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithEnv(map[string]string{ "ARANGO_ROOT_PASSWORD": defaultPassword, }), testcontainers.WithWaitStrategy(wait.ForListeningPort(defaultPort)), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/artemis/artemis.go b/modules/artemis/artemis.go index 518881e2fc..fc84578eb5 100644 --- a/modules/artemis/artemis.go +++ b/modules/artemis/artemis.go @@ -97,7 +97,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Artemis container type with a given image func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultBrokerPort, defaultHTTPPort), testcontainers.WithEnv(map[string]string{ "ARTEMIS_USER": defaultUser, @@ -109,7 +110,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom wait.ForLog("Server is now live"), wait.ForLog("REST API available"), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/azure/cosmosdb/cosmosdb.go b/modules/azure/cosmosdb/cosmosdb.go index 5c5457cd8c..7192cfe221 100644 --- a/modules/azure/cosmosdb/cosmosdb.go +++ b/modules/azure/cosmosdb/cosmosdb.go @@ -27,7 +27,8 @@ type Container struct { // Run creates an instance of the CosmosDB container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { // Initialize with module defaults - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithCmdArgs("--enable-explorer", "false"), testcontainers.WithWaitStrategy( @@ -36,7 +37,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom wait.ForListeningPort(nat.Port(defaultPort)), ), ), - } + ) // Add user-provided options moduleOpts = append(moduleOpts, opts...) diff --git a/modules/azure/eventhubs/eventhubs.go b/modules/azure/eventhubs/eventhubs.go index c9118ba1da..825718cd1b 100644 --- a/modules/azure/eventhubs/eventhubs.go +++ b/modules/azure/eventhubs/eventhubs.go @@ -99,9 +99,10 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } defaultOptions.network = azuriteNetwork - azuriteOpts := []testcontainers.ContainerCustomizer{ + azuriteOpts := make([]testcontainers.ContainerCustomizer, 0, 1+len(defaultOptions.azuriteOptions)) + azuriteOpts = append(azuriteOpts, network.WithNetwork([]string{aliasAzurite}, azuriteNetwork), - } + ) azuriteOpts = append(azuriteOpts, defaultOptions.azuriteOptions...) // start the azurite container first diff --git a/modules/azure/lowkeyvault/lowkeyvault.go b/modules/azure/lowkeyvault/lowkeyvault.go index 689a96a484..4eac747053 100644 --- a/modules/azure/lowkeyvault/lowkeyvault.go +++ b/modules/azure/lowkeyvault/lowkeyvault.go @@ -57,7 +57,8 @@ func WithNetworkAlias(alias string, forNetwork *testcontainers.DockerNetwork) te // Run creates an instance of the Lowkey Vault container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { // Initialize with module defaults - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultAPIPort.Port(), defaultMetadataPort.Port()), testcontainers.WithEnv(map[string]string{ "LOWKEY_VAULT_RELAXED_PORTS": "true", @@ -65,7 +66,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom testcontainers.WithWaitStrategy( wait.ForLog("Started LowkeyVaultApp in "), ), - } + ) // Add user-provided options moduleOpts = append(moduleOpts, opts...) diff --git a/modules/azure/servicebus/servicebus.go b/modules/azure/servicebus/servicebus.go index b69b1adba4..9f0ce61815 100644 --- a/modules/azure/servicebus/servicebus.go +++ b/modules/azure/servicebus/servicebus.go @@ -107,11 +107,11 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } defaultOptions.network = mssqlNetwork - mssqlOpts := []testcontainers.ContainerCustomizer{ + mssqlOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(defaultOptions.mssqlOptions)) + mssqlOpts = append(mssqlOpts, mssql.WithAcceptEULA(), network.WithNetwork([]string{aliasMSSQL}, mssqlNetwork), - } - + ) mssqlOpts = append(mssqlOpts, defaultOptions.mssqlOptions...) // Start the mssql container first. The EULA is accepted by default, as it is required by the servicebus emulator. diff --git a/modules/chroma/chroma.go b/modules/chroma/chroma.go index 28a4d68b56..bb1a4e929c 100644 --- a/modules/chroma/chroma.go +++ b/modules/chroma/chroma.go @@ -21,7 +21,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Chroma container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*ChromaContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("8000/tcp"), testcontainers.WithWaitStrategy( wait.ForListeningPort("8000/tcp"), @@ -29,7 +30,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return status == 200 }), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/clickhouse/clickhouse.go b/modules/clickhouse/clickhouse.go index 412e269b63..6d1809c6dc 100644 --- a/modules/clickhouse/clickhouse.go +++ b/modules/clickhouse/clickhouse.go @@ -67,7 +67,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the ClickHouse container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*ClickHouseContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(httpPort.Port(), nativePort.Port()), testcontainers.WithEnv(map[string]string{ "CLICKHOUSE_USER": defaultUser, @@ -78,7 +79,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return status == 200 }, )), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/clickhouse/options.go b/modules/clickhouse/options.go index 5f1cc70478..1c10936e3c 100644 --- a/modules/clickhouse/options.go +++ b/modules/clickhouse/options.go @@ -69,7 +69,7 @@ func WithZookeeper(host, port string) testcontainers.CustomizeRequestOption { // WithInitScripts sets the init scripts to be run when the container starts func WithInitScripts(scripts ...string) testcontainers.CustomizeRequestOption { return func(req *testcontainers.GenericContainerRequest) error { - initScripts := []testcontainers.ContainerFile{} + initScripts := make([]testcontainers.ContainerFile, 0, len(scripts)) for _, script := range scripts { cf := testcontainers.ContainerFile{ HostFilePath: script, diff --git a/modules/cockroachdb/cockroachdb.go b/modules/cockroachdb/cockroachdb.go index 7093b334f4..9da6fdc757 100644 --- a/modules/cockroachdb/cockroachdb.go +++ b/modules/cockroachdb/cockroachdb.go @@ -175,8 +175,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom }, } - moduleOpts := []testcontainers.ContainerCustomizer{ - testcontainers.WithCmd( + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)+1) + moduleOpts = append(moduleOpts, testcontainers.WithCmd( "start-single-node", memStorageFlag+defaultStoreSize, ), @@ -206,7 +206,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return connStr }), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/compose/compose_api.go b/modules/compose/compose_api.go index 02263d30aa..30b4b5e036 100644 --- a/modules/compose/compose_api.go +++ b/modules/compose/compose_api.go @@ -333,7 +333,7 @@ func (d *DockerCompose) Up(ctx context.Context, opts ...StackUpOption) (err erro if !d.provider.Config().Config.RyukDisabled { // NewReaper is deprecated: we need to find a way to create the reaper for compose // bypassing the deprecation. - reaper, err = testcontainers.NewReaper(ctx, testcontainers.SessionID(), d.provider, "") + reaper, err = testcontainers.NewReaper(ctx, testcontainers.SessionID(), d.provider, "") //nolint:staticcheck // intentional use of deprecated API for compose if err != nil { return fmt.Errorf("create reaper: %w", err) } diff --git a/modules/consul/consul.go b/modules/consul/consul.go index b2c0f736bb..3cc3e07f86 100644 --- a/modules/consul/consul.go +++ b/modules/consul/consul.go @@ -59,13 +59,14 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Consul container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*ConsulContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultHTTPAPIPort+"/tcp", defaultBrokerPort+"/tcp", defaultBrokerPort+"/udp"), testcontainers.WithWaitStrategy( wait.ForLog("Consul agent running!"), wait.ForListeningPort(defaultHTTPAPIPort+"/tcp"), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/couchbase/couchbase.go b/modules/couchbase/couchbase.go index a66e2c133c..83e7fd5090 100644 --- a/modules/couchbase/couchbase.go +++ b/modules/couchbase/couchbase.go @@ -103,9 +103,10 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } // Build moduleOpts with defaults - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 1+len(allCustomizers)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(MGMT_PORT+"/tcp", MGMT_SSL_PORT+"/tcp"), - } + ) // Append all customizers (initial services + user opts) moduleOpts = append(moduleOpts, allCustomizers...) @@ -132,6 +133,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } // StartContainer creates an instance of the Couchbase container type +// // Deprecated: use RunContainer instead func StartContainer(ctx context.Context, opts ...Option) (*CouchbaseContainer, error) { config := &Config{ @@ -146,11 +148,12 @@ func StartContainer(ctx context.Context, opts ...Option) (*CouchbaseContainer, e opt(config) } - customizers := []testcontainers.ContainerCustomizer{ + customizers := make([]testcontainers.ContainerCustomizer, 0, 3+len(config.enabledServices)) + customizers = append(customizers, WithAdminCredentials(config.username, config.password), WithIndexStorage(config.indexStorageMode), WithBuckets(config.buckets...), - } + ) for _, srv := range config.enabledServices { customizers = append(customizers, withService(srv)) diff --git a/modules/couchbase/options.go b/modules/couchbase/options.go index 4ff84fa30e..3845826175 100644 --- a/modules/couchbase/options.go +++ b/modules/couchbase/options.go @@ -3,6 +3,7 @@ package couchbase import "github.com/testcontainers/testcontainers-go" // Option is a function that configures the Couchbase container. +// // Deprecated: Use the With* functions instead. type Option func(*Config) @@ -19,6 +20,7 @@ type Config struct { // WithEnterpriseService enables the eventing service in the container. // Only available in the Enterprise Edition of Couchbase Server. +// // Deprecated: Use WithServiceEventing instead. func WithEventingService() Option { return func(c *Config) { diff --git a/modules/databend/databend.go b/modules/databend/databend.go index 26ab513d7f..71c22b0dce 100644 --- a/modules/databend/databend.go +++ b/modules/databend/databend.go @@ -41,14 +41,15 @@ func (o DatabendOption) Customize(*testcontainers.GenericContainerRequest) error // Run creates an instance of the Databend container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*DatabendContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithEnv(map[string]string{ "QUERY_DEFAULT_USER": defaultUser, "QUERY_DEFAULT_PASSWORD": defaultPassword, }), testcontainers.WithWaitStrategy(wait.ForListeningPort(defaultPort)), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/dind/dind.go b/modules/dind/dind.go index a559dfb6c1..5dddaef2db 100644 --- a/modules/dind/dind.go +++ b/modules/dind/dind.go @@ -26,7 +26,8 @@ type Container struct { // Run creates an instance of the Docker in Docker container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithCmd( "dockerd", "-H", "tcp://0.0.0.0:"+defaultDockerDaemonPortNumber, "--tls=false", ), @@ -44,7 +45,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } hc.Mounts = []mount.Mount{} }), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/dockermcpgateway/dockermcpgateway.go b/modules/dockermcpgateway/dockermcpgateway.go index 4a972061ac..424d6ad5a1 100644 --- a/modules/dockermcpgateway/dockermcpgateway.go +++ b/modules/dockermcpgateway/dockermcpgateway.go @@ -63,9 +63,11 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom cmds = append(cmds, "--secrets="+secretsPath) secretsContent := "" + var secretsContentSb66 strings.Builder for key, value := range settings.secrets { - secretsContent += key + "=" + value + "\n" + secretsContentSb66.WriteString(key + "=" + value + "\n") } + secretsContent += secretsContentSb66.String() moduleOpts = append(moduleOpts, testcontainers.WithFiles(testcontainers.ContainerFile{ Reader: strings.NewReader(secretsContent), diff --git a/modules/dolt/dolt.go b/modules/dolt/dolt.go index 7588cbc421..d6d7bba048 100644 --- a/modules/dolt/dolt.go +++ b/modules/dolt/dolt.go @@ -54,7 +54,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Dolt container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*DoltContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)+1) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("3306/tcp", "33060/tcp"), testcontainers.WithEnv(map[string]string{ "DOLT_USER": defaultUser, @@ -62,7 +63,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom "DOLT_DATABASE": defaultDatabaseName, }), testcontainers.WithWaitStrategy(wait.ForLog("Server ready. Accepting connections.")), - } + ) moduleOpts = append(moduleOpts, opts...) moduleOpts = append(moduleOpts, WithDefaultCredentials()) diff --git a/modules/dynamodb/dynamodb.go b/modules/dynamodb/dynamodb.go index b734d195b2..e9a81d54e5 100644 --- a/modules/dynamodb/dynamodb.go +++ b/modules/dynamodb/dynamodb.go @@ -20,12 +20,13 @@ type DynamoDBContainer struct { // Run creates an instance of the DynamoDB container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*DynamoDBContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 4+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithEntrypoint("java", "-Djava.library.path=./DynamoDBLocal_lib"), testcontainers.WithCmd("-jar", "DynamoDBLocal.jar"), testcontainers.WithExposedPorts(port), testcontainers.WithWaitStrategy(wait.ForListeningPort(port)), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/elasticsearch/elasticsearch.go b/modules/elasticsearch/elasticsearch.go index 9aed48b6bd..1e280334b7 100644 --- a/modules/elasticsearch/elasticsearch.go +++ b/modules/elasticsearch/elasticsearch.go @@ -43,13 +43,14 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Elasticsearch container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*ElasticsearchContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)+3) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultHTTPPort+"/tcp", defaultTCPPort+"/tcp"), testcontainers.WithEnv(map[string]string{ "discovery.type": "single-node", "cluster.routing.allocation.disk.threshold_enabled": "false", }), - } + ) // Gather all config options (defaults and then apply provided options) options := defaultOptions() diff --git a/modules/grafana-lgtm/grafana.go b/modules/grafana-lgtm/grafana.go index 1bbd87b401..41cbc25d74 100644 --- a/modules/grafana-lgtm/grafana.go +++ b/modules/grafana-lgtm/grafana.go @@ -26,7 +26,8 @@ type GrafanaLGTMContainer struct { // Run creates an instance of the Grafana LGTM container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*GrafanaLGTMContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(GrafanaPort, LokiPort, TempoPort, OtlpGrpcPort, OtlpHttpPort, PrometheusPort), testcontainers.WithWaitStrategyAndDeadline(2*time.Minute, wait.ForLog(".*The OpenTelemetry collector and the Grafana LGTM stack are up and running.*\\s").AsRegexp().WithOccurrence(1), @@ -37,7 +38,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom wait.ForListeningPort(OtlpHttpPort), wait.ForListeningPort(PrometheusPort), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/inbucket/inbucket.go b/modules/inbucket/inbucket.go index 4bff1f9179..dae475db07 100644 --- a/modules/inbucket/inbucket.go +++ b/modules/inbucket/inbucket.go @@ -36,14 +36,15 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Inbucket container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*InbucketContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("2500/tcp", "9000/tcp", "1100/tcp"), testcontainers.WithWaitStrategy( wait.ForListeningPort("2500/tcp"), wait.ForListeningPort("9000/tcp"), wait.ForListeningPort("1100/tcp"), ), - } + ) moduleOpts = append(moduleOpts, opts...) container, err := testcontainers.Run(ctx, img, moduleOpts...) diff --git a/modules/influxdb/influxdb.go b/modules/influxdb/influxdb.go index 63cedd74af..022b69498d 100644 --- a/modules/influxdb/influxdb.go +++ b/modules/influxdb/influxdb.go @@ -28,7 +28,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the InfluxDB container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*InfluxDbContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("8086/tcp", "8088/tcp"), testcontainers.WithEnv(map[string]string{ "INFLUXDB_BIND_ADDRESS": ":8088", @@ -39,7 +40,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom "INFLUXDB_HTTP_AUTH_ENABLED": "false", }), testcontainers.WithWaitStrategy(waitForHTTPHealth()), - } + ) moduleOpts = append(moduleOpts, opts...) container, err := testcontainers.Run(ctx, img, moduleOpts...) diff --git a/modules/k3s/k3s.go b/modules/k3s/k3s.go index 1f0002038d..8b2962c393 100644 --- a/modules/k3s/k3s.go +++ b/modules/k3s/k3s.go @@ -59,7 +59,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return nil, err } - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultKubeSecurePort, defaultRancherWebhookPort), testcontainers.WithHostConfigModifier(func(hc *container.HostConfig) { hc.Privileged = true @@ -79,7 +80,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom "K3S_KUBECONFIG_MODE": "644", }), testcontainers.WithWaitStrategy(wait.ForLog(".*Node controller sync successful.*").AsRegexp()), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/k6/k6.go b/modules/k6/k6.go index 8b7104ff13..b80a22a7f3 100644 --- a/modules/k6/k6.go +++ b/modules/k6/k6.go @@ -157,10 +157,11 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the K6 container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*K6Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithCmdArgs("run"), testcontainers.WithWaitStrategy(wait.ForExit()), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/kafka/kafka.go b/modules/kafka/kafka.go index 7d8813131a..6eedd73269 100644 --- a/modules/kafka/kafka.go +++ b/modules/kafka/kafka.go @@ -50,7 +50,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return nil, err } - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)+1) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(string(publicPort)), testcontainers.WithEnv(map[string]string{ // envVars { @@ -89,7 +90,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom }, }, }), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/localstack/localstack.go b/modules/localstack/localstack.go index f7e45613ca..7c41d96af9 100644 --- a/modules/localstack/localstack.go +++ b/modules/localstack/localstack.go @@ -50,6 +50,7 @@ func isMinimumVersion(image string, minVersion string) bool { // WithNetwork creates a network with the given name and attaches the container to it, setting the network alias // on that network to the given alias. +// // Deprecated: use network.WithNetwork or network.WithNewNetwork instead func WithNetwork(_ string, alias string) testcontainers.CustomizeRequestOption { return network.WithNewNetwork(context.Background(), []string{alias}) @@ -75,15 +76,16 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom envVar = localstackHostEnvVar } - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)+1) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(fmt.Sprintf("%d/tcp", defaultPort)), - testcontainers.WithWaitStrategy(wait.ForHTTP("/_localstack/health").WithPort("4566/tcp").WithStartupTimeout(120 * time.Second)), + testcontainers.WithWaitStrategy(wait.ForHTTP("/_localstack/health").WithPort("4566/tcp").WithStartupTimeout(120*time.Second)), testcontainers.WithEnv(map[string]string{}), testcontainers.WithHostConfigModifier(func(hostConfig *container.HostConfig) { hostConfig.Binds = []string{dockerHost + ":/var/run/docker.sock"} }), testcontainers.WithLogger(log.Default()), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/mariadb/mariadb.go b/modules/mariadb/mariadb.go index 02f4875a7e..414ed834f7 100644 --- a/modules/mariadb/mariadb.go +++ b/modules/mariadb/mariadb.go @@ -120,7 +120,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the MariaDB container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*MariaDBContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)+3) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("3306/tcp", "33060/tcp"), testcontainers.WithEnv(map[string]string{ "MARIADB_USER": defaultUser, @@ -128,7 +129,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom "MARIADB_DATABASE": defaultDatabaseName, }), testcontainers.WithWaitStrategy(wait.ForLog("port: 3306 mariadb.org binary distribution")), - } + ) moduleOpts = append(moduleOpts, opts...) moduleOpts = append(moduleOpts, WithDefaultCredentials()) diff --git a/modules/memcached/memcached.go b/modules/memcached/memcached.go index 262af8d5d4..3fc633e61c 100644 --- a/modules/memcached/memcached.go +++ b/modules/memcached/memcached.go @@ -19,10 +19,11 @@ type Container struct { // Run creates an instance of the Memcached container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy(wait.ForListeningPort(defaultPort)), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/milvus/milvus.go b/modules/milvus/milvus.go index 96d62284af..bb08e83b42 100644 --- a/modules/milvus/milvus.go +++ b/modules/milvus/milvus.go @@ -49,8 +49,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } // Adapted from https://github.com/milvus-io/milvus/blob/v2.6.3/scripts/standalone_embed.sh - moduleOpts := []testcontainers.ContainerCustomizer{ - testcontainers.WithExposedPorts(grpcPort, httpPort, etcdPort), + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(grpcPort, httpPort, etcdPort), testcontainers.WithEnv(map[string]string{ "ETCD_USE_EMBED": "true", "ETCD_DATA_DIR": "/var/lib/milvus/etcd", @@ -73,7 +73,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom ContainerFilePath: embedEtcdContainerPath, Reader: config, }), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/mockserver/mockserver.go b/modules/mockserver/mockserver.go index f467bdf33c..298e54a4e1 100644 --- a/modules/mockserver/mockserver.go +++ b/modules/mockserver/mockserver.go @@ -21,13 +21,14 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the MockServer container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*MockServerContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("1080/tcp"), testcontainers.WithWaitStrategy( wait.ForLog("started on port: 1080"), wait.ForListeningPort("1080/tcp").SkipInternalCheck(), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/mongodb/atlaslocal/atlaslocal.go b/modules/mongodb/atlaslocal/atlaslocal.go index d17c187866..e38ad11851 100644 --- a/modules/mongodb/atlaslocal/atlaslocal.go +++ b/modules/mongodb/atlaslocal/atlaslocal.go @@ -34,12 +34,13 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return nil, fmt.Errorf("validate options: %w", err) } - moduleOpts := []testcontainers.ContainerCustomizer{ // Set the defaults + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 4+len(opts)) + moduleOpts = append(moduleOpts, // Set the defaults testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy(wait.ForListeningPort(defaultPort), wait.ForHealthCheck()), testcontainers.WithEnv(userOpts.env()), testcontainers.WithFiles(userOpts.files...), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/mongodb/atlaslocal/atlaslocal_test.go b/modules/mongodb/atlaslocal/atlaslocal_test.go index caae6c68e6..78662b999d 100644 --- a/modules/mongodb/atlaslocal/atlaslocal_test.go +++ b/modules/mongodb/atlaslocal/atlaslocal_test.go @@ -688,10 +688,8 @@ func newMongoClient( connString, err := ctr.(*atlaslocal.Container).ConnectionString(ctx) require.NoError(t, err) - copts := []*options.ClientOptions{ - options.Client().ApplyURI(connString), - } - + copts := make([]*options.ClientOptions, 0, 1+len(opts)) + copts = append(copts, options.Client().ApplyURI(connString)) copts = append(copts, opts...) client, err := mongo.Connect(copts...) diff --git a/modules/mongodb/mongodb.go b/modules/mongodb/mongodb.go index 44e8134322..0ad57fc66a 100644 --- a/modules/mongodb/mongodb.go +++ b/modules/mongodb/mongodb.go @@ -40,14 +40,15 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the MongoDB container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*MongoDBContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)+1) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy( wait.ForLog("Waiting for connections"), wait.ForListeningPort(defaultPort), ), testcontainers.WithEnv(map[string]string{}), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/nats/nats.go b/modules/nats/nats.go index bde2779545..80a834bb9c 100644 --- a/modules/nats/nats.go +++ b/modules/nats/nats.go @@ -46,7 +46,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom moduleOpts = append(moduleOpts, opts...) // Include the command line arguments - cmdArgs := []string{} + cmdArgs := make([]string, 0, len(settings.CmdArgs)*2) for k, v := range settings.CmdArgs { // always prepend the dash because it was removed in the options cmdArgs = append(cmdArgs, "--"+k, v) diff --git a/modules/nebulagraph/nebulagraph.go b/modules/nebulagraph/nebulagraph.go index 04e713406c..5ca9f96477 100644 --- a/modules/nebulagraph/nebulagraph.go +++ b/modules/nebulagraph/nebulagraph.go @@ -33,8 +33,9 @@ func RunCluster(ctx context.Context, aggMetadCustomizers := append(defaultMetadContainerCustomizers(netRes), metadCustomizers...) metad, err := testcontainers.Run(ctx, metadImg, aggMetadCustomizers...) if err != nil { - errs := []error{fmt.Errorf("run metad container: %w", err)} errs2 := terminateContainersAndRemoveNetwork(ctx, netRes) + errs := make([]error, 0, 1+len(errs2)) + errs = append(errs, fmt.Errorf("run metad container: %w", err)) errs = append(errs, errs2...) return nil, errors.Join(errs...) } @@ -43,8 +44,9 @@ func RunCluster(ctx context.Context, aggGraphdCustomizers := append(defaultGraphdContainerCustomizers(netRes), graphdCustomizers...) graphd, err := testcontainers.Run(ctx, graphdImg, aggGraphdCustomizers...) if err != nil { - errs := []error{fmt.Errorf("run graphd container: %w", err)} errs2 := terminateContainersAndRemoveNetwork(ctx, netRes, metad) + errs := make([]error, 0, 1+len(errs2)) + errs = append(errs, fmt.Errorf("run graphd container: %w", err)) errs = append(errs, errs2...) return nil, errors.Join(errs...) } @@ -53,9 +55,10 @@ func RunCluster(ctx context.Context, aggStoragedCustomizers := append(defaultStoragedContainerCustomizers(netRes), storagedCustomizers...) storaged, err := testcontainers.Run(ctx, storagedImg, aggStoragedCustomizers...) if err != nil { - errs := []error{fmt.Errorf("run storaged container: %w", err)} fmt.Println("error starting storaged: ", err) errs2 := terminateContainersAndRemoveNetwork(ctx, netRes, graphd, metad) + errs := make([]error, 0, 1+len(errs2)) + errs = append(errs, fmt.Errorf("run storaged container: %w", err)) errs = append(errs, errs2...) return nil, errors.Join(errs...) } diff --git a/modules/neo4j/neo4j.go b/modules/neo4j/neo4j.go index d5afb56468..c28786553c 100644 --- a/modules/neo4j/neo4j.go +++ b/modules/neo4j/neo4j.go @@ -37,7 +37,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Neo4j container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Neo4jContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithEnv(map[string]string{ "NEO4J_AUTH": "none", }), @@ -53,7 +54,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom StatusCodeMatcher: isHTTPOk(), }, ), - } + ) if len(opts) == 0 { opts = append(opts, WithoutAuthentication()) diff --git a/modules/ollama/ollama.go b/modules/ollama/ollama.go index 4b2342a6ae..7611ea84e6 100644 --- a/modules/ollama/ollama.go +++ b/modules/ollama/ollama.go @@ -74,10 +74,11 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Ollama container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*OllamaContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("11434/tcp"), - testcontainers.WithWaitStrategy(wait.ForListeningPort("11434/tcp").WithStartupTimeout(60 * time.Second)), - } + testcontainers.WithWaitStrategy(wait.ForListeningPort("11434/tcp").WithStartupTimeout(60*time.Second)), + ) // Check if we need to use the local process var local *localProcess diff --git a/modules/openfga/openfga.go b/modules/openfga/openfga.go index 0bf91ebb70..fed1616eb3 100644 --- a/modules/openfga/openfga.go +++ b/modules/openfga/openfga.go @@ -49,7 +49,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the OpenFGA container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*OpenFGAContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithCmd("run"), testcontainers.WithExposedPorts("3000/tcp", "8080/tcp", "8081/tcp"), testcontainers.WithWaitStrategy( @@ -65,7 +66,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return status == http.StatusOK }), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/openldap/openldap.go b/modules/openldap/openldap.go index d434589164..c7b6b2126f 100644 --- a/modules/openldap/openldap.go +++ b/modules/openldap/openldap.go @@ -111,7 +111,8 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the OpenLDAP container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*OpenLDAPContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithEnv(map[string]string{ "LDAP_ADMIN_USERNAME": defaultUser, "LDAP_ADMIN_PASSWORD": defaultPassword, @@ -122,7 +123,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom wait.ForLog("** Starting slapd **"), wait.ForListeningPort("1389/tcp"), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/opensearch/opensearch.go b/modules/opensearch/opensearch.go index b2e400f0f9..ad4c1ebf84 100644 --- a/modules/opensearch/opensearch.go +++ b/modules/opensearch/opensearch.go @@ -48,8 +48,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom username := settings.Username password := settings.Password - moduleOpts := []testcontainers.ContainerCustomizer{ - testcontainers.WithEnv(map[string]string{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 4+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithEnv(map[string]string{ "discovery.type": "single-node", "DISABLE_INSTALL_DEMO_CONFIG": "true", "DISABLE_SECURITY_PLUGIN": "true", @@ -99,7 +99,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return r.Tagline == "The OpenSearch Project: https://opensearch.org/" })), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/pinecone/pinecone.go b/modules/pinecone/pinecone.go index 62c4b63f66..1da8720e25 100644 --- a/modules/pinecone/pinecone.go +++ b/modules/pinecone/pinecone.go @@ -14,9 +14,10 @@ type Container struct { // Run creates an instance of the Pinecone container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 1+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("5080/tcp"), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/postgres/postgres.go b/modules/postgres/postgres.go index 7e4230132a..8c15b08062 100644 --- a/modules/postgres/postgres.go +++ b/modules/postgres/postgres.go @@ -89,7 +89,7 @@ func WithDatabase(dbName string) testcontainers.ContainerCustomizer { // These init scripts will be executed in sorted name order as defined by the container's current locale, which defaults to en_US.utf8. // If you need to run your scripts in a specific order, consider using `WithOrderedInitScripts` instead. func WithInitScripts(scripts ...string) testcontainers.CustomizeRequestOption { - containerFiles := []testcontainers.ContainerFile{} + containerFiles := make([]testcontainers.ContainerFile, 0, len(scripts)) for _, script := range scripts { initScript := testcontainers.ContainerFile{ HostFilePath: script, @@ -105,7 +105,7 @@ func WithInitScripts(scripts ...string) testcontainers.CustomizeRequestOption { // WithOrderedInitScripts sets the init scripts to be run when the container starts. // The scripts will be run in the order that they are provided in this function. func WithOrderedInitScripts(scripts ...string) testcontainers.CustomizeRequestOption { - containerFiles := []testcontainers.ContainerFile{} + containerFiles := make([]testcontainers.ContainerFile, 0, len(scripts)) for idx, script := range scripts { initScript := testcontainers.ContainerFile{ HostFilePath: script, @@ -152,7 +152,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } } - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithEnv(map[string]string{ "POSTGRES_USER": defaultUser, "POSTGRES_PASSWORD": defaultPassword, @@ -160,7 +161,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom }), testcontainers.WithExposedPorts("5432/tcp"), testcontainers.WithCmd("postgres", "-c", "fsync=off"), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/pulsar/pulsar.go b/modules/pulsar/pulsar.go index d169e64574..4f260592d8 100644 --- a/modules/pulsar/pulsar.go +++ b/modules/pulsar/pulsar.go @@ -76,10 +76,8 @@ func WithFunctionsWorker() testcontainers.CustomizeRequestOption { return err } - ss := []wait.Strategy{ - wait.ForLog("Function worker service started"), - } - + ss := make([]wait.Strategy, 0, 1+len(defaultWaitStrategies)) + ss = append(ss, wait.ForLog("Function worker service started")) ss = append(ss, defaultWaitStrategies...) return testcontainers.WithWaitStrategy(ss...)(req) @@ -114,12 +112,10 @@ func WithTransactions() testcontainers.CustomizeRequestOption { } // clone defaultWaitStrategies - ss := []wait.Strategy{ - wait.ForHTTP(transactionTopicEndpoint).WithPort(defaultPulsarAdminPort).WithStatusCodeMatcher(func(statusCode int) bool { - return statusCode == 200 - }), - } - + ss := make([]wait.Strategy, 0, 1+len(defaultWaitStrategies)) + ss = append(ss, wait.ForHTTP(transactionTopicEndpoint).WithPort(defaultPulsarAdminPort).WithStatusCodeMatcher(func(statusCode int) bool { + return statusCode == 200 + })) ss = append(ss, defaultWaitStrategies...) return testcontainers.WithWaitStrategy(ss...)(req) @@ -142,11 +138,12 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // // - command: "/bin/bash -c /pulsar/bin/apply-config-from-env.py /pulsar/conf/standalone.conf && bin/pulsar standalone --no-functions-worker -nss" func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPulsarPort, defaultPulsarAdminPort), testcontainers.WithWaitStrategy(defaultWaitStrategies...), testcontainers.WithCmd("/bin/bash", "-c", strings.Join([]string{defaultPulsarCmd, defaultPulsarCmdWithoutFunctionsWorker}, " ")), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/qdrant/qdrant.go b/modules/qdrant/qdrant.go index a430fb6c76..388721edc2 100644 --- a/modules/qdrant/qdrant.go +++ b/modules/qdrant/qdrant.go @@ -22,13 +22,14 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize // Run creates an instance of the Qdrant container type func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*QdrantContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("6333/tcp", "6334/tcp"), testcontainers.WithWaitStrategy( wait.ForListeningPort("6333/tcp").WithStartupTimeout(5*time.Second), wait.ForListeningPort("6334/tcp").WithStartupTimeout(5*time.Second), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/scylladb/scylladb.go b/modules/scylladb/scylladb.go index 42493807c7..72f3833cc3 100644 --- a/modules/scylladb/scylladb.go +++ b/modules/scylladb/scylladb.go @@ -108,7 +108,8 @@ func (c Container) AlternatorConnectionHost(ctx context.Context) (string, error) // Run starts a ScyllaDB container with the specified image and options func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(port), testcontainers.WithCmd( "--developer-mode=1", @@ -123,7 +124,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return strings.Contains(string(data), "COMPLETED") }), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/solace/solace.go b/modules/solace/solace.go index 8cbc4b3e0b..ba16123265 100644 --- a/modules/solace/solace.go +++ b/modules/solace/solace.go @@ -63,7 +63,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom exposedPorts[i] = fmt.Sprintf("%d/tcp", service.Port) } - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(exposedPorts...), testcontainers.WithHostConfigModifier(func(hc *container.HostConfig) { hc.ShmSize = settings.shmSize @@ -87,7 +88,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } }), testcontainers.WithWaitStrategy(waitStrategies...), - } + ) moduleOpts = append(moduleOpts, opts...) container, err := testcontainers.Run(ctx, img, moduleOpts...) diff --git a/modules/weaviate/weaviate_test.go b/modules/weaviate/weaviate_test.go index 1cf8b0fa6e..b2fb986852 100644 --- a/modules/weaviate/weaviate_test.go +++ b/modules/weaviate/weaviate_test.go @@ -44,8 +44,7 @@ func TestWeaviate(t *testing.T) { // } require.NoError(t, err) - var opts []grpc.DialOption - + opts := make([]grpc.DialOption, 0, 1) opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) conn, err := grpc.NewClient(host, opts...) require.NoErrorf(t, err, "failed to dial connection") From df71a47c4f3cc2088f46ec50f6ff38acf5270ffd Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 14:57:33 +0100 Subject: [PATCH 09/12] fix: lint --- modules/cockroachdb/cockroachdb.go | 3 ++- modules/milvus/milvus.go | 3 ++- modules/opensearch/opensearch.go | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/cockroachdb/cockroachdb.go b/modules/cockroachdb/cockroachdb.go index 9da6fdc757..2f5e3fdfc8 100644 --- a/modules/cockroachdb/cockroachdb.go +++ b/modules/cockroachdb/cockroachdb.go @@ -176,7 +176,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)+1) - moduleOpts = append(moduleOpts, testcontainers.WithCmd( + moduleOpts = append(moduleOpts, + testcontainers.WithCmd( "start-single-node", memStorageFlag+defaultStoreSize, ), diff --git a/modules/milvus/milvus.go b/modules/milvus/milvus.go index bb08e83b42..f2ae08654b 100644 --- a/modules/milvus/milvus.go +++ b/modules/milvus/milvus.go @@ -50,7 +50,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom // Adapted from https://github.com/milvus-io/milvus/blob/v2.6.3/scripts/standalone_embed.sh moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 5+len(opts)) - moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(grpcPort, httpPort, etcdPort), + moduleOpts = append(moduleOpts, + testcontainers.WithExposedPorts(grpcPort, httpPort, etcdPort), testcontainers.WithEnv(map[string]string{ "ETCD_USE_EMBED": "true", "ETCD_DATA_DIR": "/var/lib/milvus/etcd", diff --git a/modules/opensearch/opensearch.go b/modules/opensearch/opensearch.go index ad4c1ebf84..9b2b4b9260 100644 --- a/modules/opensearch/opensearch.go +++ b/modules/opensearch/opensearch.go @@ -49,7 +49,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom password := settings.Password moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 4+len(opts)) - moduleOpts = append(moduleOpts, testcontainers.WithEnv(map[string]string{ + moduleOpts = append(moduleOpts, + testcontainers.WithEnv(map[string]string{ "discovery.type": "single-node", "DISABLE_INSTALL_DEMO_CONFIG": "true", "DISABLE_SECURITY_PLUGIN": "true", From 145b23b5e0049c3a2efe59e83daa6bb651a1c3e8 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 15:27:33 +0100 Subject: [PATCH 10/12] fix: lint --- modules/nebulagraph/nebulagraph.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/nebulagraph/nebulagraph.go b/modules/nebulagraph/nebulagraph.go index 5ca9f96477..b085704ae2 100644 --- a/modules/nebulagraph/nebulagraph.go +++ b/modules/nebulagraph/nebulagraph.go @@ -66,23 +66,26 @@ func RunCluster(ctx context.Context, // 5. Run storage registration command with retry logic activator, err := testcontainers.Run(ctx, defaultNebulaConsoleImage, defaultActivatorContainerCustomizers(netRes)...) if err != nil { - errs := []error{fmt.Errorf("run activator container: %w", err)} errs2 := terminateContainersAndRemoveNetwork(ctx, netRes, storaged, graphd, metad) + errs := make([]error, 0, 1+len(errs2)) + errs = append(errs, fmt.Errorf("run activator container: %w", err)) errs = append(errs, errs2...) return nil, errors.Join(errs...) } activatorState, err := activator.State(ctx) if err != nil { - errs := []error{fmt.Errorf("get activator container state: %w", err)} errs2 := terminateContainersAndRemoveNetwork(ctx, netRes, storaged, graphd, metad, activator) + errs := make([]error, 0, 1+len(errs2)) + errs = append(errs, fmt.Errorf("get activator container state: %w", err)) errs = append(errs, errs2...) return nil, errors.Join(errs...) } if !activatorState.Running && activatorState.ExitCode != 0 { - errs := []error{fmt.Errorf("activator container not running or exited with code %d", activatorState.ExitCode)} errs2 := terminateContainersAndRemoveNetwork(ctx, netRes, storaged, graphd, metad) + errs := make([]error, 0, 1+len(errs2)) + errs = append(errs, fmt.Errorf("activator container not running or exited with code %d", activatorState.ExitCode)) errs = append(errs, errs2...) return nil, errors.Join(errs...) } From 284b909bf636a7160698cbe6515f5f66db937fa4 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 15:42:38 +0100 Subject: [PATCH 11/12] fix: lint --- .golangci.yml | 4 ++++ modules/couchbase/options.go | 13 +++++++++---- modules/gcloud/bigquery/bigquery.go | 5 +++-- modules/gcloud/bigtable/bigtable.go | 5 +++-- modules/gcloud/datastore/datastore.go | 5 +++-- modules/gcloud/firestore/firestore.go | 5 +++-- modules/gcloud/pubsub/pubsub.go | 5 +++-- modules/gcloud/spanner.go | 5 +++-- modules/gcloud/spanner/spanner.go | 5 +++-- 9 files changed, 34 insertions(+), 18 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 0afeb4e2dd..6f68a9370f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -40,6 +40,10 @@ linters: - revive path: "internal/sdk/types/" text: "var-naming: avoid meaningless package names" + - linters: + - revive + path: "gcloud/internal/shared/" + text: "var-naming: avoid meaningless package names" presets: - comments - common-false-positives diff --git a/modules/couchbase/options.go b/modules/couchbase/options.go index 3845826175..3f41c19121 100644 --- a/modules/couchbase/options.go +++ b/modules/couchbase/options.go @@ -30,7 +30,8 @@ func WithEventingService() Option { // WithAnalyticsService enables the analytics service in the container. // Only available in the Enterprise Edition of Couchbase Server. -// Deprecated: Use WithServiceAnalytics instead. +// +// Deprecated: Use [WithServiceAnalytics] instead. func WithAnalyticsService() Option { return func(c *Config) { c.enabledServices = append(c.enabledServices, analytics) @@ -56,7 +57,8 @@ func WithAdminCredentials(username, password string) credentialsCustomizer { } // WithCredentials sets the username and password for the administrator user. -// Deprecated: Use WithAdminCredentials instead. +// +// Deprecated: Use [WithAdminCredentials] instead. func WithCredentials(username, password string) Option { return func(c *Config) { c.username = username @@ -65,7 +67,8 @@ func WithCredentials(username, password string) Option { } // WithBucket adds a bucket to the container. -// Deprecated: Use WithBuckets instead. +// +// Deprecated: Use [WithBuckets] instead. func WithBucket(bucket bucket) Option { return func(c *Config) { c.buckets = append(c.buckets, bucket) @@ -89,6 +92,7 @@ func WithBuckets(bucket ...bucket) bucketCustomizer { } // WithImageName allows to override the default image name. +// // Deprecated: Use testcontainers.WithImage instead. func WithImageName(imageName string) Option { return func(c *Config) { @@ -113,7 +117,8 @@ func WithIndexStorage(indexStorageMode indexStorageMode) indexStorageCustomizer } // WithIndexStorageMode sets the storage mode to be used in the cluster. -// Deprecated: Use WithIndexStorage instead. +// +// Deprecated: Use [WithIndexStorage] instead. func WithIndexStorageMode(indexStorageMode indexStorageMode) Option { return func(c *Config) { c.indexStorageMode = indexStorageMode diff --git a/modules/gcloud/bigquery/bigquery.go b/modules/gcloud/bigquery/bigquery.go index bd60c24bf4..fd25cf90cd 100644 --- a/modules/gcloud/bigquery/bigquery.go +++ b/modules/gcloud/bigquery/bigquery.go @@ -41,7 +41,8 @@ func (c *Container) URI() string { // Run creates an instance of the BigQuery GCloud container type. // The URI uses http:// as the protocol. func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort9050, defaultPort9060), testcontainers.WithWaitStrategy( wait.ForListeningPort(defaultPort9050), @@ -49,7 +50,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom return status == 200 }).WithStartupTimeout(time.Second*5), ), - } + ) settings := defaultOptions() for _, opt := range opts { diff --git a/modules/gcloud/bigtable/bigtable.go b/modules/gcloud/bigtable/bigtable.go index 25f731ba7a..680112f6d3 100644 --- a/modules/gcloud/bigtable/bigtable.go +++ b/modules/gcloud/bigtable/bigtable.go @@ -34,13 +34,14 @@ func (c *Container) URI() string { // Run creates an instance of the BigTable GCloud container type. // The URI uses the empty string as the protocol. func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy( wait.ForListeningPort(defaultPort), wait.ForLog("running"), ), - } + ) settings := defaultOptions() for _, opt := range opts { diff --git a/modules/gcloud/datastore/datastore.go b/modules/gcloud/datastore/datastore.go index 37286866fb..14b787894c 100644 --- a/modules/gcloud/datastore/datastore.go +++ b/modules/gcloud/datastore/datastore.go @@ -34,13 +34,14 @@ func (c *Container) URI() string { // Run creates an instance of the Datastore GCloud container type. // The URI uses the empty string as the protocol. func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy( wait.ForListeningPort(defaultPort), wait.ForHTTP("/").WithPort(defaultPort), ), - } + ) settings := defaultOptions() for _, opt := range opts { diff --git a/modules/gcloud/firestore/firestore.go b/modules/gcloud/firestore/firestore.go index e73cc344a8..2a7fdff5d3 100644 --- a/modules/gcloud/firestore/firestore.go +++ b/modules/gcloud/firestore/firestore.go @@ -50,7 +50,8 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom } // Build moduleOpts with defaults - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy( wait.ForListeningPort(defaultPort), @@ -61,7 +62,7 @@ func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustom "-c", "gcloud beta emulators firestore start --host-port 0.0.0.0:"+defaultPortNumber+" "+gcloudParameters, ), - } + ) // Append user options moduleOpts = append(moduleOpts, opts...) diff --git a/modules/gcloud/pubsub/pubsub.go b/modules/gcloud/pubsub/pubsub.go index 2db3035e7d..e6424a22a0 100644 --- a/modules/gcloud/pubsub/pubsub.go +++ b/modules/gcloud/pubsub/pubsub.go @@ -34,13 +34,14 @@ func (c *Container) URI() string { // Run creates an instance of the Pubsub GCloud container type. // The URI uses the empty string as the protocol. func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 3+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy( wait.ForListeningPort(defaultPort), wait.ForLog("started"), ), - } + ) settings := defaultOptions() for _, opt := range opts { diff --git a/modules/gcloud/spanner.go b/modules/gcloud/spanner.go index 1862814683..64127de152 100644 --- a/modules/gcloud/spanner.go +++ b/modules/gcloud/spanner.go @@ -16,13 +16,14 @@ func RunSpannerContainer(ctx context.Context, opts ...testcontainers.ContainerCu // Deprecated: use [spanner.Run] instead // RunSpanner creates an instance of the GCloud container type for Spanner. func RunSpanner(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*GCloudContainer, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts("9010/tcp"), testcontainers.WithWaitStrategy( wait.ForListeningPort("9010/tcp"), wait.ForLog("Cloud Spanner emulator running"), ), - } + ) moduleOpts = append(moduleOpts, opts...) diff --git a/modules/gcloud/spanner/spanner.go b/modules/gcloud/spanner/spanner.go index 8c242ae02b..86c4c58c42 100644 --- a/modules/gcloud/spanner/spanner.go +++ b/modules/gcloud/spanner/spanner.go @@ -34,13 +34,14 @@ func (c *Container) URI() string { // Run creates an instance of the Spanner GCloud container type. // The URI uses the empty string as the protocol. func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) { - moduleOpts := []testcontainers.ContainerCustomizer{ + moduleOpts := make([]testcontainers.ContainerCustomizer, 0, 2+len(opts)) + moduleOpts = append(moduleOpts, testcontainers.WithExposedPorts(defaultPort), testcontainers.WithWaitStrategy( wait.ForListeningPort(defaultPort), wait.ForLog("Cloud Spanner emulator running"), ), - } + ) settings := defaultOptions() for _, opt := range opts { From 5039e331e63cdff527f07f0c19bedc0fcb514ca6 Mon Sep 17 00:00:00 2001 From: mdelapenya Date: Sat, 7 Mar 2026 16:30:37 +0100 Subject: [PATCH 12/12] fix: golang version in test Dockerfiles --- modules/azure/lowkeyvault/testdata/Dockerfile | 2 +- wait/testdata/http/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/azure/lowkeyvault/testdata/Dockerfile b/modules/azure/lowkeyvault/testdata/Dockerfile index d0980b51d0..9003b95f06 100644 --- a/modules/azure/lowkeyvault/testdata/Dockerfile +++ b/modules/azure/lowkeyvault/testdata/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24-alpine@sha256:fc2cff6625f3c1c92e6c85938ac5bd09034ad0d4bc2dfb08278020b68540dbb5 as builder +FROM golang:1.25-alpine@sha256:8e02eb337d9e0ea459e041f1ee5eece41cbb61f1d83e7d883a3e2fb4862063fa as builder WORKDIR /app COPY . . RUN mkdir -p dist diff --git a/wait/testdata/http/Dockerfile b/wait/testdata/http/Dockerfile index 5dedfa8f1d..a06e74b2b3 100644 --- a/wait/testdata/http/Dockerfile +++ b/wait/testdata/http/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24-alpine@sha256:fc2cff6625f3c1c92e6c85938ac5bd09034ad0d4bc2dfb08278020b68540dbb5 as builder +FROM golang:1.25-alpine@sha256:8e02eb337d9e0ea459e041f1ee5eece41cbb61f1d83e7d883a3e2fb4862063fa as builder WORKDIR /app COPY . . RUN mkdir -p dist