Skip to content

chore(deps)!: migrate from docker/docker to moby/moby v29#3617

Closed
appleboy wants to merge 9 commits intotestcontainers:mainfrom
appleboy:chore/migrate-moby-v29
Closed

chore(deps)!: migrate from docker/docker to moby/moby v29#3617
appleboy wants to merge 9 commits intotestcontainers:mainfrom
appleboy:chore/migrate-moby-v29

Conversation

@appleboy
Copy link
Copy Markdown
Contributor

Summary

  • Migrate from github.com/docker/docker v28.5.2+incompatible to github.com/moby/moby/api v1.54.0 + github.com/moby/moby/client v0.3.0
  • Replace nat.Port (string) with network.Port (struct) across all 65+ modules
  • Update all Docker client method calls to new option/result struct patterns
  • Remove deprecated NetworkSettingsBase/DefaultNetworkSettings from container inspection
  • Replace filters.NewArgs with client.Filters map type
  • Convert string IP addresses to netip.Addr where required

Motivation

Fixes CVE-2026-34040 (HIGH): Moby AuthZ plugin bypass when provided oversized request bodies
Fixes CVE-2026-33997 (MEDIUM): Moby off-by-one error in plugin privilege validation

Both CVEs are fixed in Docker/Moby v29.3.1, which is available via the new github.com/moby/moby/api and github.com/moby/moby/client submodules.

Breaking Changes

  • Docker client dependency moved from github.com/docker/docker to github.com/moby/moby/{api,client}
  • nat.Port (string type) replaced by network.Port (struct type) — callers must use network.MustParsePort("80/tcp") instead of nat.Port("80/tcp")
  • Container inspection NetworkSettings structure changed (no more NetworkSettingsBase/DefaultNetworkSettings)
  • All client method signatures use option/result struct patterns
  • filters package removed, replaced by client.Filters

Test plan

  • go build ./... passes for root module
  • go vet ./... passes for root module
  • All 65+ submodules compile successfully
  • CI tests pass

🤖 Generated with Claude Code

- Replace github.com/docker/docker v28.5.2 with github.com/moby/moby/api v1.54.0 and github.com/moby/moby/client v0.3.0
- Migrate all import paths from docker/docker to moby/moby submodules
- Replace nat.Port string type with network.Port struct type across all modules
- Remove NetworkSettingsBase and DefaultNetworkSettings from container inspection
- Update all Docker client method calls to new option/result struct pattern
- Replace filters.NewArgs with client.Filters map type
- Convert string IP addresses to netip.Addr where required by new API
- Add local stdWriter implementation in ollama module to replace removed stdcopy.NewStdWriter
- Update all 65+ submodule go.mod files

BREAKING CHANGE: The Docker client dependency has moved from github.com/docker/docker to
github.com/moby/moby/api and github.com/moby/moby/client. Port types changed from nat.Port
(string) to network.Port (struct). Container inspection NetworkSettings structure changed.
All client method signatures now use option/result struct patterns.

Fixes CVE-2026-34040 (HIGH) and CVE-2026-33997 (MEDIUM).
@appleboy appleboy requested a review from a team as a code owner March 31, 2026 07:14
@netlify
Copy link
Copy Markdown

netlify bot commented Mar 31, 2026

Deploy Preview for testcontainers-go ready!

Name Link
🔨 Latest commit d626faf
🔍 Latest deploy log https://app.netlify.com/projects/testcontainers-go/deploys/69cbd9801a0b7300087bae68
😎 Deploy Preview https://deploy-preview-3617--testcontainers-go.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 31, 2026

Important

Review skipped

Too many files!

This PR contains 232 files, which is 82 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2ff5d657-428c-4a04-99f3-96ad17aa29cb

📥 Commits

Reviewing files that changed from the base of the PR and between 440ee5c and d626faf.

⛔ Files ignored due to path filters (66)
  • examples/nginx/go.sum is excluded by !**/*.sum
  • go.sum is excluded by !**/*.sum
  • modules/aerospike/go.sum is excluded by !**/*.sum
  • modules/arangodb/go.sum is excluded by !**/*.sum
  • modules/artemis/go.sum is excluded by !**/*.sum
  • modules/azure/go.sum is excluded by !**/*.sum
  • modules/azurite/go.sum is excluded by !**/*.sum
  • modules/cassandra/go.sum is excluded by !**/*.sum
  • modules/chroma/go.sum is excluded by !**/*.sum
  • modules/clickhouse/go.sum is excluded by !**/*.sum
  • modules/cockroachdb/go.sum is excluded by !**/*.sum
  • modules/compose/go.sum is excluded by !**/*.sum
  • modules/consul/go.sum is excluded by !**/*.sum
  • modules/couchbase/go.sum is excluded by !**/*.sum
  • modules/databend/go.sum is excluded by !**/*.sum
  • modules/dind/go.sum is excluded by !**/*.sum
  • modules/dockermcpgateway/go.sum is excluded by !**/*.sum
  • modules/dockermodelrunner/go.sum is excluded by !**/*.sum
  • modules/dolt/go.sum is excluded by !**/*.sum
  • modules/dynamodb/go.sum is excluded by !**/*.sum
  • modules/elasticsearch/go.sum is excluded by !**/*.sum
  • modules/etcd/go.sum is excluded by !**/*.sum
  • modules/forgejo/go.sum is excluded by !**/*.sum
  • modules/gcloud/go.sum is excluded by !**/*.sum
  • modules/grafana-lgtm/go.sum is excluded by !**/*.sum
  • modules/inbucket/go.sum is excluded by !**/*.sum
  • modules/influxdb/go.sum is excluded by !**/*.sum
  • modules/k3s/go.sum is excluded by !**/*.sum
  • modules/k6/go.sum is excluded by !**/*.sum
  • modules/kafka/go.sum is excluded by !**/*.sum
  • modules/localstack/go.sum is excluded by !**/*.sum
  • modules/mariadb/go.sum is excluded by !**/*.sum
  • modules/meilisearch/go.sum is excluded by !**/*.sum
  • modules/memcached/go.sum is excluded by !**/*.sum
  • modules/milvus/go.sum is excluded by !**/*.sum
  • modules/minio/go.sum is excluded by !**/*.sum
  • modules/mockserver/go.sum is excluded by !**/*.sum
  • modules/mongodb/go.sum is excluded by !**/*.sum
  • modules/mssql/go.sum is excluded by !**/*.sum
  • modules/mysql/go.sum is excluded by !**/*.sum
  • modules/nats/go.sum is excluded by !**/*.sum
  • modules/nebulagraph/go.sum is excluded by !**/*.sum
  • modules/neo4j/go.sum is excluded by !**/*.sum
  • modules/ollama/go.sum is excluded by !**/*.sum
  • modules/openfga/go.sum is excluded by !**/*.sum
  • modules/openldap/go.sum is excluded by !**/*.sum
  • modules/opensearch/go.sum is excluded by !**/*.sum
  • modules/pinecone/go.sum is excluded by !**/*.sum
  • modules/postgres/go.sum is excluded by !**/*.sum
  • modules/pulsar/go.sum is excluded by !**/*.sum
  • modules/qdrant/go.sum is excluded by !**/*.sum
  • modules/rabbitmq/go.sum is excluded by !**/*.sum
  • modules/redis/go.sum is excluded by !**/*.sum
  • modules/redpanda/go.sum is excluded by !**/*.sum
  • modules/registry/go.sum is excluded by !**/*.sum
  • modules/scylladb/go.sum is excluded by !**/*.sum
  • modules/socat/go.sum is excluded by !**/*.sum
  • modules/solace/go.sum is excluded by !**/*.sum
  • modules/surrealdb/go.sum is excluded by !**/*.sum
  • modules/tidb/go.sum is excluded by !**/*.sum
  • modules/toxiproxy/go.sum is excluded by !**/*.sum
  • modules/valkey/go.sum is excluded by !**/*.sum
  • modules/vault/go.sum is excluded by !**/*.sum
  • modules/vearch/go.sum is excluded by !**/*.sum
  • modules/weaviate/go.sum is excluded by !**/*.sum
  • modules/yugabytedb/go.sum is excluded by !**/*.sum
📒 Files selected for processing (232)
  • cleanup.go
  • container.go
  • container_test.go
  • docker.go
  • docker_auth.go
  • docker_auth_test.go
  • docker_client.go
  • docker_client_test.go
  • docker_exec_test.go
  • docker_mounts.go
  • docker_test.go
  • examples/nginx/go.mod
  • examples/nginx/nginx.go
  • examples_test.go
  • exec/processor.go
  • from_dockerfile_test.go
  • generic_test.go
  • go.mod
  • image.go
  • internal/core/client.go
  • internal/core/docker_host.go
  • internal/core/docker_host_test.go
  • internal/core/docker_socket.go
  • internal/core/network/network.go
  • lifecycle.go
  • lifecycle_test.go
  • logconsumer_test.go
  • modules/aerospike/aerospike.go
  • modules/aerospike/examples_test.go
  • modules/aerospike/go.mod
  • modules/arangodb/arangodb.go
  • modules/arangodb/go.mod
  • modules/arangodb/options.go
  • modules/artemis/artemis.go
  • modules/artemis/go.mod
  • modules/azure/azurite/azurite.go
  • modules/azure/cosmosdb/cosmosdb.go
  • modules/azure/cosmosdb/policy.go
  • modules/azure/eventhubs/eventhubs.go
  • modules/azure/go.mod
  • modules/azure/lowkeyvault/lowkeyvault.go
  • modules/azure/lowkeyvault/testdata/main.go
  • modules/azure/servicebus/servicebus.go
  • modules/azurite/go.mod
  • modules/cassandra/cassandra.go
  • modules/cassandra/go.mod
  • modules/chroma/chroma.go
  • modules/chroma/go.mod
  • modules/clickhouse/clickhouse.go
  • modules/clickhouse/clickhouse_test.go
  • modules/clickhouse/go.mod
  • modules/cockroachdb/cockroachdb.go
  • modules/cockroachdb/go.mod
  • modules/compose/compose_api.go
  • modules/compose/compose_api_test.go
  • modules/compose/compose_examples_test.go
  • modules/compose/compose_local.go
  • modules/compose/compose_test.go
  • modules/compose/go.mod
  • modules/consul/consul.go
  • modules/consul/go.mod
  • modules/couchbase/couchbase.go
  • modules/couchbase/go.mod
  • modules/databend/databend.go
  • modules/databend/go.mod
  • modules/dind/dind.go
  • modules/dind/dind_test.go
  • modules/dind/examples_test.go
  • modules/dind/go.mod
  • modules/dockermcpgateway/dockermcpgateway.go
  • modules/dockermcpgateway/go.mod
  • modules/dockermodelrunner/docker_desktop_test.go
  • modules/dockermodelrunner/dockermodelrunner.go
  • modules/dockermodelrunner/go.mod
  • modules/dolt/dolt.go
  • modules/dolt/go.mod
  • modules/dynamodb/dynamodb.go
  • modules/dynamodb/go.mod
  • modules/elasticsearch/elasticsearch.go
  • modules/elasticsearch/go.mod
  • modules/etcd/etcd.go
  • modules/etcd/etcd_unit_test.go
  • modules/etcd/go.mod
  • modules/forgejo/forgejo.go
  • modules/forgejo/go.mod
  • modules/gcloud/bigquery.go
  • modules/gcloud/bigquery/bigquery.go
  • modules/gcloud/bigtable.go
  • modules/gcloud/bigtable/bigtable.go
  • modules/gcloud/datastore.go
  • modules/gcloud/datastore/datastore.go
  • modules/gcloud/firestore.go
  • modules/gcloud/firestore/firestore.go
  • modules/gcloud/gcloud.go
  • modules/gcloud/go.mod
  • modules/gcloud/pubsub.go
  • modules/gcloud/pubsub/pubsub.go
  • modules/gcloud/spanner.go
  • modules/gcloud/spanner/spanner.go
  • modules/grafana-lgtm/go.mod
  • modules/grafana-lgtm/grafana.go
  • modules/inbucket/go.mod
  • modules/inbucket/inbucket.go
  • modules/influxdb/go.mod
  • modules/influxdb/influxdb.go
  • modules/k3s/go.mod
  • modules/k3s/k3s.go
  • modules/k6/go.mod
  • modules/k6/k6.go
  • modules/k6/k6_test.go
  • modules/kafka/go.mod
  • modules/kafka/kafka.go
  • modules/localstack/examples_test.go
  • modules/localstack/go.mod
  • modules/localstack/localstack.go
  • modules/localstack/v1/s3_test.go
  • modules/localstack/v2/s3_test.go
  • modules/mariadb/go.mod
  • modules/mariadb/mariadb.go
  • modules/meilisearch/go.mod
  • modules/meilisearch/meilisearch.go
  • modules/memcached/go.mod
  • modules/memcached/memcached.go
  • modules/milvus/go.mod
  • modules/milvus/milvus.go
  • modules/minio/go.mod
  • modules/minio/minio.go
  • modules/mockserver/go.mod
  • modules/mockserver/mockserver.go
  • modules/mongodb/atlaslocal/atlaslocal.go
  • modules/mongodb/go.mod
  • modules/mongodb/mongodb.go
  • modules/mssql/go.mod
  • modules/mssql/mssql.go
  • modules/mysql/go.mod
  • modules/mysql/mysql.go
  • modules/nats/go.mod
  • modules/nats/nats.go
  • modules/nebulagraph/go.mod
  • modules/nebulagraph/nebulagraph.go
  • modules/nebulagraph/options.go
  • modules/neo4j/go.mod
  • modules/neo4j/neo4j.go
  • modules/neo4j/neo4j_test.go
  • modules/ollama/examples_test.go
  • modules/ollama/go.mod
  • modules/ollama/local.go
  • modules/ollama/local_test.go
  • modules/ollama/ollama.go
  • modules/ollama/options.go
  • modules/openfga/go.mod
  • modules/openfga/openfga.go
  • modules/openldap/go.mod
  • modules/openldap/openldap.go
  • modules/opensearch/go.mod
  • modules/opensearch/opensearch.go
  • modules/pinecone/go.mod
  • modules/pinecone/pinecone.go
  • modules/postgres/go.mod
  • modules/postgres/postgres.go
  • modules/postgres/postgres_test.go
  • modules/postgres/wait_strategies.go
  • modules/pulsar/go.mod
  • modules/pulsar/pulsar.go
  • modules/pulsar/pulsar_test.go
  • modules/qdrant/go.mod
  • modules/qdrant/qdrant.go
  • modules/rabbitmq/go.mod
  • modules/rabbitmq/rabbitmq.go
  • modules/redis/go.mod
  • modules/redis/redis.go
  • modules/redpanda/go.mod
  • modules/redpanda/redpanda.go
  • modules/registry/go.mod
  • modules/registry/registry.go
  • modules/registry/registry_test.go
  • modules/scylladb/go.mod
  • modules/scylladb/scylladb.go
  • modules/socat/go.mod
  • modules/socat/socat.go
  • modules/solace/go.mod
  • modules/solace/solace.go
  • modules/surrealdb/go.mod
  • modules/surrealdb/surrealdb.go
  • modules/tidb/go.mod
  • modules/tidb/tidb.go
  • modules/toxiproxy/examples_test.go
  • modules/toxiproxy/go.mod
  • modules/toxiproxy/toxiproxy.go
  • modules/toxiproxy/toxiproxy_test.go
  • modules/valkey/go.mod
  • modules/valkey/valkey.go
  • modules/vault/go.mod
  • modules/vault/vault.go
  • modules/vearch/go.mod
  • modules/vearch/vearch.go
  • modules/weaviate/go.mod
  • modules/weaviate/weaviate.go
  • modules/yugabytedb/examples_test.go
  • modules/yugabytedb/go.mod
  • modules/yugabytedb/yugabytedb.go
  • modules/yugabytedb/yugabytedb_test.go
  • mounts_test.go
  • network.go
  • network/examples_test.go
  • network/network.go
  • network/network_test.go
  • options.go
  • options_test.go
  • port_forwarding.go
  • reaper.go
  • reaper_test.go
  • reuse_test.go
  • testing.go
  • udp_port_binding_test.go
  • wait/exec_test.go
  • wait/exit_test.go
  • wait/file_test.go
  • wait/health.go
  • wait/health_test.go
  • wait/host_port.go
  • wait/host_port_test.go
  • wait/http.go
  • wait/http_test.go
  • wait/log_test.go
  • wait/nop.go
  • wait/sql.go
  • wait/sql_test.go
  • wait/strategytarget_mock_test.go
  • wait/testdata/http/main.go
  • wait/wait.go
  • wait/wait_test.go

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

- Separate moby imports from testcontainers imports with blank line
- Fix MustParsePort missing /tcp protocol suffix
@mdelapenya
Copy link
Copy Markdown
Member

Hi @appleboy thanks for this!

Would you mind taking a look at the lint phase of the modules, as Forjego failed?

I'm not at the keyboard ATM but will take a look on this today.

@thaJeztah this work is probably related to your other PR, isn't it?

- Separate moby/moby imports from testcontainers imports with blank line
- Required by gci linter config (standard, default, testcontainers prefix groups)
- Fix gci import grouping (separate moby from testcontainers)
- Replace deprecated client.NewClientWithOpts with client.New
- Remove deprecated client.WithAPIVersionNegotiation (now default)
- Replace deprecated client.WithVersion with client.WithAPIVersion
- Replace deprecated strslice.StrSlice with []string
- Fix unlambda gocritic warnings in lifecycle_test.go
- Fix unused-parameter revive warnings
- Fix indent-error-flow revive warning in wait testdata
- Fix missing strconv imports in test files
- Fix ContainerInspect/VolumeRemove/ServerVersion API calls in tests
- Update strategytarget_mock_test.go from make generate
- Fix import ordering and PortMap type alias expansion
@thaJeztah
Copy link
Copy Markdown
Contributor

Oh! missed this one; yes, this is probably doing the same as #3591

I kept it in draft, pending moby/moby@19ef53a (moby/moby#52165) to be in a release.

w.r.t. this;

Fixes GHSA-x744-4wpc-v9h2 (HIGH): Moby AuthZ plugin bypass when provided oversized request bodies
Fixes GHSA-pxq6-2prw-chj9 (MEDIUM): Moby off-by-one error in plugin privilege validation

Those ONLY impact the daemon binaries, and any scanner warnings about a CVE are false positives, so can be ignored (unless you're building the docker daemon binaries).

- Move moby/moby/api from indirect to direct require since pinecone.go imports moby/moby/api/types/network
- Move moby/moby/api from indirect to direct require since nebulagraph.go
  and options.go import moby/moby/api/types/network
- Import ordering changed due to new moby/moby/api module paths
- Move moby/moby/client from indirect to direct in etcd,
  dockermodelrunner, and k6 modules that import it in source/test files
@appleboy
Copy link
Copy Markdown
Contributor Author

appleboy commented Apr 1, 2026

@thaJeztah @mdelapenya

Hi, I noticed that this PR seems to duplicate the work in #3617. Could we clarify which PR should be the one to move forward? I'm also wondering if @thaJeztah would like to take ownership of this. I'm happy to either close this PR or continue depending on what the maintainers prefer.

@mdelapenya
Copy link
Copy Markdown
Member

@appleboy I added some commits on top of @thaJeztah's PR, as that PR was failing less tests in the CI.

If you agree, we are continue the work in that PR, which I want to merge it ASAP, so that unblocks you (and more people in the community)

BTW I'm interested in learning more about how you use testcontainers-go, could you share a bit of that? 🙏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants