diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml
index 80f7cbee3..496cd9f21 100644
--- a/.github/workflows/cicd.yml
+++ b/.github/workflows/cicd.yml
@@ -48,6 +48,7 @@ jobs:
{ name: "Testcontainers.CosmosDb", runs-on: "ubuntu-22.04" },
{ name: "Testcontainers.Couchbase", runs-on: "ubuntu-22.04" },
{ name: "Testcontainers.CouchDb", runs-on: "ubuntu-22.04" },
+ { name: "Testcontainers.Db2", runs-on: "ubuntu-22.04" },
{ name: "Testcontainers.DynamoDb", runs-on: "ubuntu-22.04" },
{ name: "Testcontainers.Elasticsearch", runs-on: "ubuntu-22.04" },
{ name: "Testcontainers.EventStoreDb", runs-on: "ubuntu-22.04" },
diff --git a/Directory.Packages.props b/Directory.Packages.props
index cae45c862..8e9a696b3 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -41,6 +41,8 @@
+
+
diff --git a/Testcontainers.sln b/Testcontainers.sln
index 4afa799e9..06e1381fc 100644
--- a/Testcontainers.sln
+++ b/Testcontainers.sln
@@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Couchbase",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.CouchDb", "src\Testcontainers.CouchDb\Testcontainers.CouchDb.csproj", "{DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Db2", "src\Testcontainers.Db2\Testcontainers.Db2.csproj", "{ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.DynamoDb", "src\Testcontainers.DynamoDb\Testcontainers.DynamoDb.csproj", "{2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Elasticsearch", "src\Testcontainers.Elasticsearch\Testcontainers.Elasticsearch.csproj", "{641DDEA5-B6E0-41E6-BA11-7A28C0913127}"
@@ -135,6 +137,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.CouchDb.Test
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Databases.Tests", "tests\Testcontainers.Databases.Tests\Testcontainers.Databases.Tests.csproj", "{DA54916E-1128-4200-B6AE-9F5BF02D832D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Db2.Tests", "tests\Testcontainers.Db2.Tests\Testcontainers.Db2.Tests.csproj", "{AF9853AB-86E7-49DE-8DF8-454838E90D6F}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.DynamoDb.Tests", "tests\Testcontainers.DynamoDb.Tests\Testcontainers.DynamoDb.Tests.csproj", "{101515E6-74C1-40F9-85C8-871F742A378D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Elasticsearch.Tests", "tests\Testcontainers.Elasticsearch.Tests\Testcontainers.Elasticsearch.Tests.csproj", "{DD5B3678-468F-4D73-AECE-705E3D66CD43}"
@@ -266,6 +270,10 @@ Global
{DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9}.Release|Any CPU.Build.0 = Release|Any CPU
{2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -466,6 +474,10 @@ Global
{DA54916E-1128-4200-B6AE-9F5BF02D832D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DA54916E-1128-4200-B6AE-9F5BF02D832D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DA54916E-1128-4200-B6AE-9F5BF02D832D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AF9853AB-86E7-49DE-8DF8-454838E90D6F}.Release|Any CPU.Build.0 = Release|Any CPU
{101515E6-74C1-40F9-85C8-871F742A378D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{101515E6-74C1-40F9-85C8-871F742A378D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{101515E6-74C1-40F9-85C8-871F742A378D}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -635,6 +647,7 @@ Global
{A724806F-8C94-4438-8011-04A9A1575318} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
{58E94721-2681-4D82-8D94-0B2F9DB0D575} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
{DCECB1F6-D9AA-431F-AE42-25D56B9E7DFC} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
+ {ED3C611F-DFE2-4AB7-A323-B500E95B4FF9} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
{2EAFA567-9F68-4C52-9DBC-8F3EC11BB2CE} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
{641DDEA5-B6E0-41E6-BA11-7A28C0913127} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
{84D707E0-C9FA-4327-85DC-0AFEBEA73572} = {673F23AE-7694-4BB9-ABD4-136D6C13634E}
@@ -685,6 +698,7 @@ Global
{809322BA-D690-4F2B-B884-23F895663963} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
{E4520FB1-4466-4DCA-AD08-4075102C68D3} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
{DA54916E-1128-4200-B6AE-9F5BF02D832D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
+ {AF9853AB-86E7-49DE-8DF8-454838E90D6F} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
{101515E6-74C1-40F9-85C8-871F742A378D} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
{DD5B3678-468F-4D73-AECE-705E3D66CD43} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
{64F8E9B9-78FD-4E13-BDDF-0340E2D4E1D0} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF}
diff --git a/docs/modules/db2.md b/docs/modules/db2.md
new file mode 100644
index 000000000..8df65e230
--- /dev/null
+++ b/docs/modules/db2.md
@@ -0,0 +1,31 @@
+# Db2
+
+[Db2](https://www.ibm.com/db2) is a relational database engine developed by IBM.
+
+Add the following dependency to your project file:
+
+```shell title="NuGet"
+dotnet add package Testcontainers.Db2
+```
+
+!!! warning
+
+ The Linux client dependency, [Net.IBM.Data.Db2-lnx](https://www.nuget.org/packages/Net.IBM.Data.Db2-lnx), requires additional configurations. We use the [Testcontainers.Db2.Tests.targets](https://github.com/testcontainers/testcontainers-dotnet/blob/develop/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets) file to configure the environment variables: `LD_LIBRARY_PATH`, `PATH`, `DB2_CLI_DRIVER_INSTALL_PATH`, at runtime.
+
+You can start an Db2 container instance from any .NET application. This example uses xUnit.net's `IAsyncLifetime` interface to manage the lifecycle of the container. The container is started in the `InitializeAsync` method before the test method runs, ensuring that the environment is ready for testing. After the test completes, the container is removed in the `DisposeAsync` method.
+
+=== "Usage Example"
+ ```csharp
+ --8<-- "tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs:UseDb2Container"
+ ```
+
+The test example uses the following NuGet dependencies:
+
+=== "Package References"
+ ```xml
+ --8<-- "tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj:PackageReferences"
+ ```
+
+To execute the tests, use the command `dotnet test` from a terminal.
+
+--8<-- "docs/modules/_call_out_test_projects.txt"
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index bf65d57f9..f0c491d57 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -47,6 +47,7 @@ nav:
- examples/aspnet.md
- Modules:
- modules/index.md
+ - modules/db2.md
- modules/elasticsearch.md
- modules/mongodb.md
- modules/mssql.md
diff --git a/src/Testcontainers.Db2/.editorconfig b/src/Testcontainers.Db2/.editorconfig
new file mode 100644
index 000000000..6f066619d
--- /dev/null
+++ b/src/Testcontainers.Db2/.editorconfig
@@ -0,0 +1 @@
+root = true
\ No newline at end of file
diff --git a/src/Testcontainers.Db2/Db2Builder.cs b/src/Testcontainers.Db2/Db2Builder.cs
new file mode 100644
index 000000000..3f1b9ccf1
--- /dev/null
+++ b/src/Testcontainers.Db2/Db2Builder.cs
@@ -0,0 +1,149 @@
+namespace Testcontainers.Db2;
+
+///
+[PublicAPI]
+public sealed class Db2Builder : ContainerBuilder
+{
+ public const string Db2Image = "icr.io/db2_community/db2:12.1.0.0";
+
+ public const ushort Db2Port = 50000;
+
+ public const string DefaultDatabase = "test";
+
+ public const string DefaultUsername = "db2inst1";
+
+ public const string DefaultPassword = "db2inst1";
+
+ private const string AcceptLicenseAgreementEnvVar = "LICENSE";
+
+ private const string AcceptLicenseAgreement = "accept";
+
+ private const string DeclineLicenseAgreement = "decline";
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public Db2Builder()
+ : this(new Db2Configuration())
+ {
+ DockerResourceConfiguration = Init().DockerResourceConfiguration;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The Docker resource configuration.
+ private Db2Builder(Db2Configuration resourceConfiguration)
+ : base(resourceConfiguration)
+ {
+ DockerResourceConfiguration = resourceConfiguration;
+ }
+
+ ///
+ protected override Db2Configuration DockerResourceConfiguration { get; }
+
+ ///
+ /// Accepts the license agreement.
+ ///
+ ///
+ /// When is set to true, the Db2 license is accepted.
+ ///
+ /// A boolean value indicating whether the Db2 license agreement is accepted.
+ /// A configured instance of .
+ public Db2Builder WithAcceptLicenseAgreement(bool acceptLicenseAgreement)
+ {
+ var licenseAgreement = acceptLicenseAgreement ? AcceptLicenseAgreement : DeclineLicenseAgreement;
+ return WithEnvironment(AcceptLicenseAgreementEnvVar, licenseAgreement);
+ }
+
+ ///
+ /// Sets the Db2 database name.
+ ///
+ /// The Db2 database.
+ /// A configured instance of .
+ public Db2Builder WithDatabase(string database)
+ {
+ return Merge(DockerResourceConfiguration, new Db2Configuration(database: database))
+ .WithEnvironment("DBNAME", database);
+ }
+
+ ///
+ /// Sets the Db2 username.
+ ///
+ /// The Db2 username.
+ /// A configured instance of .
+ public Db2Builder WithUsername(string username)
+ {
+ return Merge(DockerResourceConfiguration, new Db2Configuration(username: username))
+ .WithEnvironment("DB2INSTANCE", username)
+ .WithTmpfsMount(string.Join("/", string.Empty, "home", username, "data"));
+ }
+
+ ///
+ /// Sets the Db2 password.
+ ///
+ /// The Db2 password.
+ /// A configured instance of .
+ public Db2Builder WithPassword(string password)
+ {
+ return Merge(DockerResourceConfiguration, new Db2Configuration(password: password))
+ .WithEnvironment("DB2INST1_PASSWORD", password);
+ }
+
+ ///
+ public override Db2Container Build()
+ {
+ Validate();
+ return new Db2Container(DockerResourceConfiguration);
+ }
+
+ ///
+ protected override Db2Builder Init() => base.Init()
+ .WithImage(Db2Image)
+ .WithPortBinding(Db2Port, true)
+ .WithDatabase(DefaultDatabase)
+ .WithUsername(DefaultUsername)
+ .WithPassword(DefaultPassword)
+ .WithPrivileged(true)
+ .WithWaitStrategy(Wait.ForUnixContainer().UntilMessageIsLogged("Setup has completed."));
+
+ ///
+ protected override void Validate()
+ {
+ const string message = "The image '{0}' requires you to accept a license agreement.";
+
+ base.Validate();
+
+ Predicate licenseAgreementNotAccepted = value =>
+ !value.Environments.TryGetValue(AcceptLicenseAgreementEnvVar, out var licenseAgreementValue) || !AcceptLicenseAgreement.Equals(licenseAgreementValue, StringComparison.Ordinal);
+
+ _ = Guard.Argument(DockerResourceConfiguration, nameof(DockerResourceConfiguration.Image))
+ .ThrowIf(argument => licenseAgreementNotAccepted(argument.Value), argument => throw new ArgumentException(string.Format(message, DockerResourceConfiguration.Image.FullName), argument.Name));
+
+ _ = Guard.Argument(DockerResourceConfiguration.Username, nameof(DockerResourceConfiguration.Username))
+ .NotNull()
+ .NotEmpty();
+
+ _ = Guard.Argument(DockerResourceConfiguration.Password, nameof(DockerResourceConfiguration.Password))
+ .NotNull()
+ .NotEmpty();
+ }
+
+ ///
+ protected override Db2Builder Clone(IResourceConfiguration resourceConfiguration)
+ {
+ return Merge(DockerResourceConfiguration, new Db2Configuration(resourceConfiguration));
+ }
+
+ ///
+ protected override Db2Builder Clone(IContainerConfiguration resourceConfiguration)
+ {
+ return Merge(DockerResourceConfiguration, new Db2Configuration(resourceConfiguration));
+ }
+
+ ///
+ protected override Db2Builder Merge(Db2Configuration oldValue, Db2Configuration newValue)
+ {
+ return new Db2Builder(new Db2Configuration(oldValue, newValue));
+ }
+}
\ No newline at end of file
diff --git a/src/Testcontainers.Db2/Db2Configuration.cs b/src/Testcontainers.Db2/Db2Configuration.cs
new file mode 100644
index 000000000..97208985b
--- /dev/null
+++ b/src/Testcontainers.Db2/Db2Configuration.cs
@@ -0,0 +1,80 @@
+namespace Testcontainers.Db2;
+
+///
+[PublicAPI]
+public sealed class Db2Configuration : ContainerConfiguration
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The Db2 database.
+ /// The Db2 username.
+ /// The Db2 password.
+ public Db2Configuration(
+ string database = null,
+ string username = null,
+ string password = null)
+ {
+ Database = database;
+ Username = username;
+ Password = password;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The Docker resource configuration.
+ public Db2Configuration(IResourceConfiguration resourceConfiguration)
+ : base(resourceConfiguration)
+ {
+ // Passes the configuration upwards to the base implementations to create an updated immutable copy.
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The Docker resource configuration.
+ public Db2Configuration(IContainerConfiguration resourceConfiguration)
+ : base(resourceConfiguration)
+ {
+ // Passes the configuration upwards to the base implementations to create an updated immutable copy.
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The Docker resource configuration.
+ public Db2Configuration(Db2Configuration resourceConfiguration)
+ : this(new Db2Configuration(), resourceConfiguration)
+ {
+ // Passes the configuration upwards to the base implementations to create an updated immutable copy.
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The old Docker resource configuration.
+ /// The new Docker resource configuration.
+ public Db2Configuration(Db2Configuration oldValue, Db2Configuration newValue)
+ : base(oldValue, newValue)
+ {
+ Database = BuildConfiguration.Combine(oldValue.Database, newValue.Database);
+ Username = BuildConfiguration.Combine(oldValue.Username, newValue.Username);
+ Password = BuildConfiguration.Combine(oldValue.Password, newValue.Password);
+ }
+
+ ///
+ /// Gets the Db2 database.
+ ///
+ public string Database { get; }
+
+ ///
+ /// Gets the Db2 username.
+ ///
+ public string Username { get; }
+
+ ///
+ /// Gets the Db2 password.
+ ///
+ public string Password { get; }
+}
\ No newline at end of file
diff --git a/src/Testcontainers.Db2/Db2Container.cs b/src/Testcontainers.Db2/Db2Container.cs
new file mode 100644
index 000000000..a52dd5642
--- /dev/null
+++ b/src/Testcontainers.Db2/Db2Container.cs
@@ -0,0 +1,48 @@
+namespace Testcontainers.Db2;
+
+///
+[PublicAPI]
+public sealed class Db2Container : DockerContainer, IDatabaseContainer
+{
+ private readonly Db2Configuration _configuration;
+
+ public Db2Container(Db2Configuration configuration) : base(configuration)
+ {
+ _configuration = configuration;
+ }
+
+ ///
+ /// Gets the Db2 connection string.
+ ///
+ /// The Db2 connection string.
+ public string GetConnectionString()
+ {
+ var properties = new Dictionary();
+ properties.Add("Server", Hostname + ":" + GetMappedPublicPort(Db2Builder.Db2Port));
+ properties.Add("Database", _configuration.Database);
+ properties.Add("UID", _configuration.Username);
+ properties.Add("PWD", _configuration.Password);
+ return string.Join(";", properties.Select(property => string.Join("=", property.Key, property.Value)));
+ }
+
+ ///
+ /// Executes the SQL script in the Db2 container.
+ ///
+ /// The content of the SQL script to execute.
+ /// Cancellation token.
+ /// Task that completes when the SQL script has been executed.
+ public async Task ExecScriptAsync(string scriptContent, CancellationToken ct = default)
+ {
+ const string db2ShellCommandFormat = "su - {1} -c \"db2 connect to {0} && db2 -tvf '{2}'\"";
+
+ var scriptFilePath = string.Join("/", string.Empty, "tmp", Guid.NewGuid().ToString("D"), Path.GetRandomFileName());
+
+ var db2ShellCommand = string.Format(db2ShellCommandFormat, _configuration.Database, _configuration.Username, scriptFilePath);
+
+ await CopyAsync(Encoding.Default.GetBytes(scriptContent), scriptFilePath, Unix.FileMode644, ct)
+ .ConfigureAwait(false);
+
+ return await ExecAsync(new [] { "/bin/sh", "-c", db2ShellCommand}, ct)
+ .ConfigureAwait(false);
+ }
+}
\ No newline at end of file
diff --git a/src/Testcontainers.Db2/Testcontainers.Db2.csproj b/src/Testcontainers.Db2/Testcontainers.Db2.csproj
new file mode 100644
index 000000000..9a25b9c4d
--- /dev/null
+++ b/src/Testcontainers.Db2/Testcontainers.Db2.csproj
@@ -0,0 +1,12 @@
+
+
+ net8.0;net9.0;netstandard2.0;netstandard2.1
+ latest
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Testcontainers.Db2/Usings.cs b/src/Testcontainers.Db2/Usings.cs
new file mode 100644
index 000000000..e2b02a51e
--- /dev/null
+++ b/src/Testcontainers.Db2/Usings.cs
@@ -0,0 +1,13 @@
+global using System;
+global using System.Collections.Generic;
+global using System.IO;
+global using System.Linq;
+global using System.Text;
+global using System.Threading;
+global using System.Threading.Tasks;
+global using Docker.DotNet.Models;
+global using DotNet.Testcontainers;
+global using DotNet.Testcontainers.Builders;
+global using DotNet.Testcontainers.Configurations;
+global using DotNet.Testcontainers.Containers;
+global using JetBrains.Annotations;
\ No newline at end of file
diff --git a/tests/Testcontainers.Db2.Tests/.editorconfig b/tests/Testcontainers.Db2.Tests/.editorconfig
new file mode 100644
index 000000000..6f066619d
--- /dev/null
+++ b/tests/Testcontainers.Db2.Tests/.editorconfig
@@ -0,0 +1 @@
+root = true
\ No newline at end of file
diff --git a/tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs b/tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs
new file mode 100644
index 000000000..3b74470d7
--- /dev/null
+++ b/tests/Testcontainers.Db2.Tests/Db2ContainerTest.cs
@@ -0,0 +1,48 @@
+namespace Testcontainers.Db2;
+
+public sealed class Db2ContainerTest : IAsyncLifetime
+{
+ // # --8<-- [start:UseDb2Container]
+ private readonly Db2Container _db2Container = new Db2Builder().WithAcceptLicenseAgreement(true).Build();
+
+ public Task InitializeAsync()
+ {
+ return _db2Container.StartAsync();
+ }
+
+ public Task DisposeAsync()
+ {
+ return _db2Container.DisposeAsync().AsTask();
+ }
+
+ [Fact]
+ [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
+ public void ConnectionStateReturnsOpen()
+ {
+ // Given
+ using DbConnection connection = new DB2Connection(_db2Container.GetConnectionString());
+
+ // When
+ connection.Open();
+
+ // Then
+ Assert.Equal(ConnectionState.Open, connection.State);
+ }
+
+ [Fact]
+ [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
+ public async Task ExecScriptReturnsSuccessful()
+ {
+ // Given
+ const string scriptContent = "SELECT 1 FROM SYSIBM.SYSDUMMY1;";
+
+ // When
+ var execResult = await _db2Container.ExecScriptAsync(scriptContent)
+ .ConfigureAwait(true);
+
+ // Then
+ Assert.True(0L.Equals(execResult.ExitCode), execResult.Stderr);
+ Assert.Empty(execResult.Stderr);
+ }
+ // # --8<-- [end:UseDb2Container]
+}
\ No newline at end of file
diff --git a/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj
new file mode 100644
index 000000000..58eff6fce
--- /dev/null
+++ b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.csproj
@@ -0,0 +1,26 @@
+
+
+ net9.0
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets
new file mode 100644
index 000000000..32b2c12b2
--- /dev/null
+++ b/tests/Testcontainers.Db2.Tests/Testcontainers.Db2.Tests.targets
@@ -0,0 +1,22 @@
+
+
+ $(MSBuildProjectDirectory)/linux.runsettings
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/Testcontainers.Db2.Tests/Usings.cs b/tests/Testcontainers.Db2.Tests/Usings.cs
new file mode 100644
index 000000000..dbf73bb31
--- /dev/null
+++ b/tests/Testcontainers.Db2.Tests/Usings.cs
@@ -0,0 +1,6 @@
+global using System.Data;
+global using System.Data.Common;
+global using System.Threading.Tasks;
+global using DotNet.Testcontainers.Commons;
+global using IBM.Data.Db2;
+global using Xunit;
\ No newline at end of file
diff --git a/tests/Testcontainers.Db2.Tests/linux.runsettings b/tests/Testcontainers.Db2.Tests/linux.runsettings
new file mode 100644
index 000000000..a6f6417c0
--- /dev/null
+++ b/tests/Testcontainers.Db2.Tests/linux.runsettings
@@ -0,0 +1,10 @@
+
+
+
+
+ Set by MSBuild
+ Set by MSBuild
+ Set by MSBuild
+
+
+
\ No newline at end of file