From f880b38443ac72b7fbdd4b506bd49430e32b44ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 1 Oct 2025 10:41:36 -0600 Subject: [PATCH] Add DB2 container implementation under org.testcontainers.db2 --- docs/modules/databases/db2.md | 6 +- .../containers/Db2Container.java | 2 + .../org/testcontainers/db2/Db2Container.java | 143 ++++++++++++++++++ .../org/testcontainers/Db2TestImages.java | 2 +- .../Db2ContainerTest.java} | 7 +- 5 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java rename modules/db2/src/test/java/org/testcontainers/{junit/db2/SimpleDb2Test.java => db2/Db2ContainerTest.java} (88%) diff --git a/docs/modules/databases/db2.md b/docs/modules/databases/db2.md index fde68a77afe..7a5ba79a86f 100644 --- a/docs/modules/databases/db2.md +++ b/docs/modules/databases/db2.md @@ -1,19 +1,17 @@ # DB2 Module -Testcontainers module for [DB2](https://hub.docker.com/r/ibmcom/db2) +Testcontainers module for [DB2](https://www.ibm.com/docs/en/db2/11.5.x?topic=deployments-db2-community-edition-docker) ## Usage example You can start a DB2 container instance from any Java application by using: -[Container definition](../../../modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java) inside_block:container +[Container definition](../../../modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java) inside_block:container !!! warning "EULA Acceptance" Due to licencing restrictions you are required to accept an EULA for this container image. To indicate that you accept the DB2 image EULA, call the `acceptLicense()` method, or place a file at the root of the classpath named `container-license-acceptance.txt`, e.g. at `src/test/resources/container-license-acceptance.txt`. This file should contain the line: `ibmcom/db2:11.5.0.0a` (or, if you are overriding the docker image name/tag, update accordingly). - - Please see the [`ibmcom/db2` image documentation](https://hub.docker.com/r/ibmcom/db2) for a link to the EULA document. See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 18fb4aac0e6..9f5b9dfde89 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -18,7 +18,9 @@ * + * @deprecated use {@link org.testcontainers.db2.Db2Container} instead. */ +@Deprecated public class Db2Container extends JdbcDatabaseContainer { public static final String NAME = "db2"; diff --git a/modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java new file mode 100644 index 00000000000..bdd182599e5 --- /dev/null +++ b/modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java @@ -0,0 +1,143 @@ +package org.testcontainers.db2; + +import com.github.dockerjava.api.model.Capability; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.LicenseAcceptance; + +import java.time.Duration; +import java.util.Set; + +/** + * Testcontainers implementation for IBM DB2. + *

+ * Supported images: {@code icr.io/db2_community/db2}, {@code ibmcom/db2} + *

+ * Exposed ports: + *

+ */ +public class Db2Container extends JdbcDatabaseContainer { + + public static final String NAME = "db2"; + + private static final DockerImageName DEFAULT_NEW_IMAGE_NAME = DockerImageName.parse("icr.io/db2_community/db2"); + + public static final int DB2_PORT = 50000; + + private String databaseName = "test"; + + private String username = "db2inst1"; + + private String password = "foobar1234"; + + public Db2Container(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public Db2Container(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_NEW_IMAGE_NAME); + + withCreateContainerCmdModifier(cmd -> cmd.withCapAdd(Capability.IPC_LOCK).withCapAdd(Capability.IPC_OWNER)); + waitingFor(Wait.forLogMessage(".*Setup has completed\\..*", 1).withStartupTimeout(Duration.ofMinutes(10))); + + addExposedPort(DB2_PORT); + } + + /** + * @return the ports on which to check if the container is ready + * @deprecated use {@link #getLivenessCheckPortNumbers()} instead + */ + @Override + @Deprecated + protected Set getLivenessCheckPorts() { + return super.getLivenessCheckPorts(); + } + + @Override + protected void configure() { + // If license was not accepted programmatically, check if it was accepted via resource file + if (!getEnvMap().containsKey("LICENSE")) { + LicenseAcceptance.assertLicenseAccepted(this.getDockerImageName()); + acceptLicense(); + } + + addEnv("DBNAME", databaseName); + addEnv("DB2INSTANCE", username); + addEnv("DB2INST1_PASSWORD", password); + + // These settings help the DB2 container start faster + if (!getEnvMap().containsKey("AUTOCONFIG")) { + addEnv("AUTOCONFIG", "false"); + } + if (!getEnvMap().containsKey("ARCHIVE_LOGS")) { + addEnv("ARCHIVE_LOGS", "false"); + } + } + + /** + * Accepts the license for the DB2 container by setting the LICENSE=accept + * variable as described at https://hub.docker.com/r/ibmcom/db2 + */ + public Db2Container acceptLicense() { + addEnv("LICENSE", "accept"); + return this; + } + + @Override + public String getDriverClassName() { + return "com.ibm.db2.jcc.DB2Driver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters(":", ";", ";"); + return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName + additionalUrlParams; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public Db2Container withUsername(String username) { + this.username = username; + return this; + } + + @Override + public Db2Container withPassword(String password) { + this.password = password; + return this; + } + + @Override + public Db2Container withDatabaseName(String dbName) { + this.databaseName = dbName; + return this; + } + + @Override + protected void waitUntilContainerStarted() { + getWaitStrategy().waitUntilReady(this); + } + + @Override + protected String getTestQueryString() { + return "SELECT 1 FROM SYSIBM.SYSDUMMY1"; + } +} diff --git a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java index b0bfc869272..002d030b1c5 100644 --- a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java +++ b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface Db2TestImages { - DockerImageName DB2_IMAGE = DockerImageName.parse("ibmcom/db2:11.5.0.0a"); + DockerImageName DB2_IMAGE = DockerImageName.parse("icr.io/db2_community/db2:11.5.8.0"); } diff --git a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java b/modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java similarity index 88% rename from modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java rename to modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java index 95222330e09..6b17d1583f7 100644 --- a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java +++ b/modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java @@ -1,8 +1,7 @@ -package org.testcontainers.junit.db2; +package org.testcontainers.db2; import org.junit.jupiter.api.Test; import org.testcontainers.Db2TestImages; -import org.testcontainers.containers.Db2Container; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -10,12 +9,12 @@ import static org.assertj.core.api.Assertions.assertThat; -class SimpleDb2Test extends AbstractContainerDatabaseTest { +class Db2ContainerTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - Db2Container db2 = new Db2Container("ibmcom/db2:11.5.0.0a").acceptLicense() + Db2Container db2 = new Db2Container("icr.io/db2_community/db2:11.5.8.0").acceptLicense() // } ) { db2.start();