Releases: testcontainers/testcontainers-dotnet
4.1.0
What's Changed
This is likely the last release for this year, unless urgent fixes become necessary.
I want to mention a change introduced in the last major release, where we refactored the IImage
interface. As part of this update, we removed obsolete properties and overloaded constructors. If you previously used an overload other than DockerImage(string)
, please ensure you pass the correct values to the constructor.
Additionally, we replaced Docker.DotNet with our own fork to keep the Docker Engine API up to date. Our goal is to improve reliability and performance while offering a more developer-friendly and convenient client. If you depend on a Docker client for .NET, we encourage you to contribute to this project ❤️.
On a personal note, I wish everyone a peaceful and lovely holiday season. Take this time to rest, connect with loved ones, and recharge for the new year. Take care.
🚀 Features
- feat: Add Azure Service Bus module (#1309) @HofmeisterAn
- feat: Set ryuk.container.privileged default value to true (#1313) @HofmeisterAn
- feat: Remove
net6.0
and addnet9.0
TFM (#1311) @HofmeisterAn - feat: Introduce a new Testcontainers.Xunit package (#1165) @0xced
🐛 Bug Fixes
- fix: Postpone exception in
DbContainerFixture
to match the behavior ofContainerFixture
(#1310) @0xced - fix: Do not pre-pull scratch image (#1304) @HofmeisterAn
- fix: Add HTTP wait strategy to prevent race-condition in WaitUntilHttpRequestIsSucceededTest (#1299) @HofmeisterAn
- fix: Add HTTP wait strategy to prevent race-condition in TarOutputMemoryStreamTest (#1297) @HofmeisterAn
- fix: Prepend Docker Hub namespace to repository (#1287) @HofmeisterAn
📖 Documentation
- docs: Add low level API access (#1300) @HofmeisterAn
🧹 Housekeeping
- feat: Add Respawn example (#1307) @HofmeisterAn
- chore: Add test to ensure that all test projects are configured for CI (#1305) @0xced
- chore: Run each test project on a separate runner (#1295) @HofmeisterAn
- chore: Replace Docker.DotNet with the Testcontainers organization's build (#1292) @HofmeisterAn
4.0.0
What's Changed
Thanks so much for all the effort you put into this release 🙌. We are continuing to align Testcontainers for .NET with other language implementations and working on improving the domain-specific language.
We have updated the IImage
interface to follow the domain-specific language with the correct property names. The table below shows the changes. We tried to make the transition as smooth as possible, but be aware that relying on the Repository
property might cause issues since it now resolves a different value than before. We have kept the old properties, marked them as obsolete, and provided guidance on how to migrate.
Actual | Expected (New) | |
---|---|---|
Registry | - | myregistryhost:5000 |
Repository | myregistryhost:5000/fedora | fedora/httpd |
Name | httpd | - |
Tag | version1.0 | version1.0 |
Digest | - | sha256:37a3b014d320... |
GetHostname() | myregistryhost:5000 | myregistryhost:5000 |
⚠️ Breaking Changes
- fix: Bump MSSQL image version, remove Azure SQL Edge
and Papercutmodule (#1265) @HofmeisterAn - feat: Align
IImage
properties with Docker DSL (#1256) @HofmeisterAn
🚀 Features
- feat: Use
exec
to replace current shell with the Kafka process (as ENTRYPOINT) (#1282) @jasoncouture - feat: Add getter for Azurite blob, queue and table endpoint (#1278) @pregress
- feat: Reintroduce Papercut module (#1268) @TechLiam
- feat: Add Neo4j Enterprise Edition support (
WithEnterpriseEdition(bool)
) (#1269) @Sossenbinder - feat: Support digest in
IImage
,DockerImage
and in theWithImage(string)
implementation (#1249) @Kielek - feat: Align
IImage
properties with Docker DSL (#1256) @HofmeisterAn - feat: Change visibility of
AccountName
andAccountKey
to public, move toAzuriteBuilder
(#1258) @mikecole - feat: Get Docker endpoint from Docker context (#1235) @0xced
🐛 Bug Fixes
- fix: Bump MSSQL image version, remove Azure SQL Edge and Papercut module (#1265) @HofmeisterAn
- fix: Throw exception if Docker resource does not exist instead of silently ignoring it (#1254) @0xced
🧹 Housekeeping
- fix: Do not run reusable resource tests in parallel (#1267) @HofmeisterAn
3.10.0
Hey everyone, just wanted to say a huge thanks to all of you who helped with this version — whether through contributions, reporting issues, or discussions. I've been very busy lately, and your support has been a huge help. I really appreciate it!
What's Changed
🚀 Features
- feat: Add MongoDB replica set support (#1196) @artiomchi
- feat: Detect CSharp, FSharp and Visual Basic projects (#1234) @HofmeisterAn
- feat: Improve parsing of Docker image tag version
MatchVersion(Predicate<Version>)
(#1231) @0xced - feat: Log Docker daemon labels if present (#1226) @eddumelendez
🐛 Bug Fixes
- fix: Get sqlcmd utility file path from container instead of const file path (#1221) @outofrange-consulting
- fix: Add Keycloak health port 9000 starting from major version 25 (#1213) @paulomorgado
- fix: Allow specifying the protocol (TCP, UDP, SCTP) to resolve the public assigned host port (#1219) @wolfman42
- fix: Trim relative path indicators from Dockerfile path (#1203) @HofmeisterAn
📖 Documentation
- chore: Replace codeinclude with snippets (#1251) @HofmeisterAn
- docs: Use codeinclude in module examples (#1245) @HofmeisterAn
🧹 Housekeeping
- chore: Apply fix for github.com/apache/pulsar/issues/22811 only for affected versions (#1232) @entvex
- chore: Replace codeinclude with snippets (#1251) @HofmeisterAn
- chore: Change global.json roll-forward policy from
latestPatch
tolatestMinor
(#1230) @0xced - chore: Remove obsolete UntilOperationIsSucceeded wait strategy (#1202) @HofmeisterAn
3.9.0
Thank you to everyone whose contributions made this release possible.
What's Changed
⚠️ Breaking Changes
The UntilOperationIsSucceeded(Func<bool>, int, Action<IWaitStrategy>)
wait strategy is obsolete. Instead of this wait strategy, use any other wait strategy that matches your use case and configure the retry behavior accordingly (wait strategy options).
Using reuse together with the container builder method WithName(string)
will generate a new reuse hash the first time you use the configuration. The container name was not included in calculating the reuse hash previously.
- feat: Add wait strategy options (#1168) @HofmeisterAn
- feat: Include the container name in the reuse hash (#1162) @0xced
🚀 Features
- feat: Add Apache Pulsar module (#1103) @entvex
- feat: Add custom configuration for retries, interval and timeout (#1169) @HofmeisterAn
- feat: Add wait strategy options (#1168) @HofmeisterAn
- feat: Include the container name in the reuse hash (#1162) @0xced
🐛 Bug Fixes
- fix: Add default file permission (755 for image build) (#1176) @HofmeisterAn
- fix(MySql): Create an empty
/var/lib/mysql-files
directory to prevent older versions from failing to start (#1144) @0xced
📖 Documentation
- docs: Add reading file from a container (#1151) @HofmeisterAn
🧹 Housekeeping
- chore: Remove PulsarContainer.CreateAuthenticationTokenAsync(TimeSpan) default arg (#1195) @entvex
- chore : Do not block async context on acquire lock (#1188) @HofmeisterAn
- chore: Prevent ReusableResourceTest from leaking resources (#1164) @0xced
- refactor: Replace Azure SQL Edge with PostgreSQL (#1156) @HofmeisterAn
- chore: Remove obsolete members (#1146) @HofmeisterAn
📦 Dependency Updates
- chore: Bump BouncyCastle.Cryptography (#1179) @marco-carvalho
- chore: Use new sshd:1.2.0 image (#1160) @mdelapenya
3.8.0
Thank you very much to all contributors once again. This version contains really great features and important fixes. Awesome increment 🙏.
What's Changed
⚠️ Breaking Changes
If you have overwritten the default logger previously (setting TestcontainersSettings.Logger
), please be aware that each builder now offers a dedicated API to configure the actual logger. This has several advantages; among others, it integrates very nicely into xUnit.net's scoped loggers.
🚀 Features
- feat: Use built-in PEM certificate import on .NET 6 and onwards (#1139) @0xced
- feat: Add
WithLogger(ILogger)
builder API (#1100) @0xced - feat: Add support for the target frameworks net6.0 and net8.0 (#1133) @HofmeisterAn
- feat: Add Milvus module (#1131) @roji
- feat: Embed symbols and enable continuous integration builds (deterministic source paths) (#1129) @tom-englert
- feat: Add remote container registry identity token support (#1124) @HofmeisterAn
- feat: Add URL-based resource mapping container builder API (#1118) @0xced
- feat: Add CockroachDB module (#1077) @rafaumlemos
- feat: Add reuse support (#1051) @david-szabo97
🐛 Bug Fixes
- fix: Prevent a
NullReferenceException
when pulling uncached base images to build an image (#1126) @tom-englert - fix: Prevent .dockerignore entry from matching everything if it ends with globstart (#1122) @HofmeisterAn
- fix: Consider the timestamp in the log message wait strategy (read the correct log message chunk) (#1110) @HofmeisterAn
- fix(CosmosDb): SSL connection could not be established (#1109) @WakaToa
🧹 Housekeeping
- chore: Ensure that stderr is empty after executing scripts (#1116) @0xced
- chore: Use the
pg_isready
command to assess whether PostgreSQL is ready or not (#1111) @0xced - chore: Switch to the SDK's included Central Package Management (#1106) @HofmeisterAn
- chore: Use relative ProjectReference paths instead of $(SolutionDir) (#1094) @0xced
- chore: Update xUnit.net (#1087) @HofmeisterAn
📦 Dependency Updates
- chore(deps): Bump Microsoft.Data.SqlClient from 5.1.0 to 5.1.3 in /tests/Testcontainers.SqlEdge.Tests (#1088) @dependabot
- chore(deps): Bump Microsoft.Data.SqlClient from 5.1.0 to 5.1.3 in /tests/Testcontainers.MsSql.Tests (#1089) @dependabot
3.7.0
Happy New Year and a massive thank you to all the contributors who made the new version of Testcontainers for .NET possible 🙌!
What's Changed
🚀 Features
- feat: Add Firebird SQL module (#1073) @park-jasper
- feat(Azurite): Add in-memory support (#1063) @Xzelsius
- feat: Add ArangoDB module (#1058) @ShirAvneri
- feat: Add ActiveMQ Artemis module (#1055) @ShirAvneri
- feat: Add Bigtable module (#1046) @peroyhav
- feat: Add BigQuery module (#1034) @dejandjenic
- feat: Add JanusGraph module (#837) @rngcntr
- feat: Add Papercut module (#1044) @TechLiam
- feat: Improve tar stream logging (copy files to container) (#1050) @HofmeisterAn
🐛 Bug Fixes
📖 Documentation
- docs: Add ASP.NET integration test example (#1061) @HofmeisterAn
🧹 Housekeeping
- chore: Update Ryuk image from version 0.5.1 to 0.6.0 (#1084) @HofmeisterAn
- chore: Improve the Base64Provider resilience to malformed configuration files (#1081) @0xced
- chore: Invert #if NETSTANDARD* conditional compilation conditions (#1079) @0xced
- chore: Rename the file CouchDbContainerTest.cs to CouchbaseContainerTest.cs (#1067) @mgroves
- chore: Replace custom wait strategy with default strategies (#1059) @ShirAvneri
- chore: Remove Microsoft.SourceLink.GitHub (#1057) @HofmeisterAn
- chore: Update .NET SDK to version 8 (LTS) (#1054) @HofmeisterAn
3.6.0
A heartfelt thank you to each contributor. Your contributions, whether through sharing ideas for improvements, identifying issues, submitting pull requests, or writing articles, are immensely appreciated and help me a lot. THANK YOU for your support.
What's Changed
⚠️ Breaking Changes
The members of the container and image builder, WithImagePullPolicy
and WithImageBuildPolicy
, previously received a callback argument of type ImagesListResponse
. We've now updated these callbacks, and they will receive an argument of type ImageInspectResponse
. This change was implemented to offer more detailed information regarding the actual cached image.
- feat: Use Docker's inspect API to get resource information (#1018) @HofmeisterAn
🚀 Features
- feat: Extend the "wait until file exists" API to distinguish between the test host and container filesystem (#1009) @maaex
- chore: Do not pre-pull cached images (#1032) @HofmeisterAn
- feat: Add Consul module (#1028) @witskeeper
- feat: Add Google Cloud Storage API (fake-gcs-server) module (#1023) @KSemenenko
- feat: Add PubSub module (#1005) @dejandjenic
- feat: Share common interface (IDatabaseContainer) for ADO.NET compatible containers (#920) @0xced
- feat: Use Docker's inspect API to get resource information (#1018) @HofmeisterAn
- feat: Ignore FROM args when pre-pulling images (#1016) @HofmeisterAn
- feat: Add NATS module (#1003) @niklasfp
- feat: Add Firestore module (#988) @dejandjenic
🐛 Bug Fixes
- fix: Retain the internal Couchbase builder configuration if the user overrides the default configuration (#1040) @HofmeisterAn
- fix: Prevent invalid negative timestamps getting container logs (#1038) @mausch
📖 Documentation
- docs: Add Neo4j example (#1013) @khalidabuhakmeh
- docs: Add MongoDB example (#1012) @khalidabuhakmeh
- docs: Add Elasticsearch example (#1010) @khalidabuhakmeh
- docs: Add Microsoft SQL Server example (#1008) @khalidabuhakmeh
- docs: Add Flyway example (#1002) @HofmeisterAn
🧹 Housekeeping
- refactor: Cache Docker image full and host name (#1043) @HofmeisterAn
- chore: Remove unnecessary internal APIs (#1020) @HofmeisterAn
- chore: Update SSH.NET to version 2023.0.0 (#1019) @WojciechNagorski
3.5.0
What's Changed
🚀 Features
- feat: Allow MongoDb module configuration without credentials (#983) @the-avid-engineer
- feat: Add support for RSA private key (RsaPrivateCrtKeyParameters) TLS authentication with protected Docker daemon sockets (#978) @zuntio
- feat: Add InfluxDb module (#975) @MelomanG
🐛 Bug Fixes
- fix: Do not pre pull Dockerfile build stages that do not correspond to base images (#979) @HofmeisterAn
📖 Documentation
- docs: Add documentation on enabling debug log messages for the default logger (#991) @HofmeisterAn
- docs: Add global Testcontainers header (#967) @leocross
🧹 Housekeeping
- chore: Improve error message when Docker is not running (#987) @0xced
- chore: Update BouncyCastle.Cryptography to 2.2.1 (previous Portable.BouncyCastle) (#985) @jcmrva
- chore: Add User-Agent HTTP header to Docker.DotNet client (#970) @eddumelendez
- chore: Remove
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT
env var (#971) @eddumelendez
3.4.0
Thank you to all contributors for your valuable efforts towards this release. Your contributions are greatly appreciated ❤️.
What's Changed
⚠️ Breaking Changes
- chore: Remove WithResourceMapping(string, string, UnixFileModes) obsolete flag (#964) @HofmeisterAn
- chore: Remove obsolete member CopyFileAsync (#937) @HofmeisterAn
🚀 Features
- feat: Add Azure Data Explorer Kusto emulator module (#963) @JonasBenz
- feat: Restore output consumer support (#959) @jacobjmarks
- feat: Pull dependent images from private registries while building an image (#951) @benjaminangerer
- feat: Add ClickHouse module (#944) @smbecker
- chore: Disable Elasticsearch GeoIP2 downloads (#945) @HofmeisterAn
🐛 Bug Fixes
- fix(CosmosDb): Wait until all partitions are started (#961) @jacobjmarks
- fix: Do not dispose a custom HTTP message handler in an HTTP wait strategy (#958) @jacobjmarks
- fix(MySql): Rename default database to test (do not use MySQL system schema) (#949) @benjaminoerskovtryg
- fix: Replace mysql with mariadb binary in MariaDB module (#942) @FlorianHockmann
- fix: Copy files to container without removing first character from filename (#938) @HofmeisterAn
📖 Documentation
- docs: Provide instructions for copying directories or files to the container (#939) @HofmeisterAn
🧹 Housekeeping
- chore: Disable signing NuGet dependencies (#968) @HofmeisterAn
- chore: Add test coverage to unbound port bindings (#966) @HofmeisterAn
- chore: Bump Azurite from 3.23.0 to 3.24.0 (#947) @Xzelsius
- chore: Remove obsolete member CopyFileAsync (#937) @HofmeisterAn
3.3.0
What's Changed
🚀 Features
- feat: Add support for copying directories and files to a container (#913) @HofmeisterAn
- feat: Change access modifier of OracleBuilder.WithUsername(string) to public (#923) @0xced
- feat: Add UsingHttpMessageHandler(HttpMessageHandler) to HttpWaitStrategy (#910) @mkstephenson
🐛 Bug Fixes
- fix: Use the actual Docker endpoint to extract the socket path for the Resource Reaper (#930) @HofmeisterAn
- fix: Ensure site_url is set in the MkDocs config to prevent None in sitemap generation (#927) @leocross
- fix: Remove cref from inheritdoc (#922) @HofmeisterAn
- fix: Add Docker Desktop (for Linux / macOS) authentication provider (#911) @HofmeisterAn
📖 Documentation
- docs: Fix typo in Testcontainers properties file path (#935) @HofmeisterAn
- docs: Update Testcontainers for Java docs url (#916) @leocross
- docs: Add RabbitMQ module documentation incl. an example (#918) @annaerdi
- docs: Replace "mess up" with "clutter up" in the best practices (#905) @gurry
🧹 Housekeeping
- chore: Add DebugLogLevelEnabled property to default logger implementation (#928) @HofmeisterAn
- chore: Set ContinuousIntegrationBuild and EmbedUntrackedSources MSBuild propery (#926) @HofmeisterAn
- fix: Prefer indexing instead of Enumerable methods (#912) @HofmeisterAn
- fix: Refactor tests to support Podman container runtime (#906) @HofmeisterAn
- chore: Update WeatherForecast example (#904) @HofmeisterAn
- chore: Refactor legacy TestcontainersContainerTest class (#901) @HofmeisterAn