Docker container lifecycle management for database testing environments with support for multiple database systems, configurable timeouts, and automated resource cleanup.
Main class for managing Docker containers used in database integration testing.
/**
* Manages Docker container lifecycle for database testing
* Handles container creation, startup, monitoring, and cleanup
*/
class DatabaseContainerManager {
/**
* Create a new database container
* @param dbType Database type (postgresql, mysql, mariadb, oracle, db2, sqlserver)
* @param imageTag Docker image tag to use
* @return Container ID of the created container
*/
def createContainer(dbType: String, imageTag: String): String
/**
* Start a specific container and wait for it to be ready
* @param containerId Container ID to start
* @return ContainerInfo with connection details
*/
def startContainer(containerId: String): ContainerInfo
/**
* Stop a running container
* @param containerId Container ID to stop
*/
def stopContainer(containerId: String): Unit
/**
* Get connection information for a running container
* @param containerId Container ID
* @return ConnectionInfo with JDBC details
*/
def getConnectionInfo(containerId: String): ConnectionInfo
/**
* Configure timeout settings for container operations
* @param timeout Maximum time to wait for container operations
*/
def configureTimeout(timeout: Duration): Unit
/**
* Check if a container is running and healthy
* @param containerId Container ID to check
* @return true if container is healthy, false otherwise
*/
def isContainerHealthy(containerId: String): Boolean
/**
* Get logs from a container for debugging
* @param containerId Container ID
* @return Container logs as string
*/
def getContainerLogs(containerId: String): String
/**
* Remove a container (running or stopped)
* @param containerId Container ID to remove
*/
def removeContainer(containerId: String): Unit
}Usage Examples:
val containerManager = new DatabaseContainerManager()
// Configure timeout
containerManager.configureTimeout(Duration.ofMinutes(5))
// Create and start PostgreSQL container
val containerId = containerManager.createContainer("postgresql", "postgres:13")
val containerInfo = containerManager.startContainer(containerId)
// Use connection info
val df = spark.read
.format("jdbc")
.option("url", containerInfo.jdbcUrl)
.option("user", containerInfo.username)
.option("password", containerInfo.password)
.option("dbtable", "information_schema.tables")
.load()
// Cleanup
containerManager.stopContainer(containerId)
containerManager.removeContainer(containerId)Methods for creating database-specific Docker containers.
/**
* Create a new database container with default settings
* @param dbType Database type identifier
* @param imageTag Docker image with tag
* @return Container ID string
*/
def createContainer(dbType: String, imageTag: String): String
/**
* Create container with custom configuration
* @param dbType Database type
* @param imageTag Docker image with tag
* @param config Custom container configuration
* @return Container ID string
*/
def createContainer(dbType: String, imageTag: String, config: ContainerConfig): String
/**
* Create container with environment variables
* @param dbType Database type
* @param imageTag Docker image with tag
* @param envVars Environment variables for the container
* @return Container ID string
*/
def createContainerWithEnv(dbType: String, imageTag: String, envVars: Map[String, String]): StringMethods for managing the container lifecycle.
/**
* Start container and wait for database to be ready
* @param containerId Container to start
* @return ContainerInfo with connection details
*/
def startContainer(containerId: String): ContainerInfo
/**
* Stop a running container gracefully
* @param containerId Container to stop
*/
def stopContainer(containerId: String): Unit
/**
* Force stop a container (if graceful stop fails)
* @param containerId Container to force stop
*/
def forceStopContainer(containerId: String): Unit
/**
* Restart a container
* @param containerId Container to restart
* @return Updated ContainerInfo
*/
def restartContainer(containerId: String): ContainerInfoMethods for monitoring container health and status.
/**
* Check if container is running and healthy
* @param containerId Container to check
* @return true if healthy, false otherwise
*/
def isContainerHealthy(containerId: String): Boolean
/**
* Get container status information
* @param containerId Container to inspect
* @return ContainerStatus with detailed information
*/
def getContainerStatus(containerId: String): ContainerStatus
/**
* Wait for container to become healthy
* @param containerId Container to wait for
* @param timeout Maximum time to wait
* @return true if became healthy within timeout
*/
def waitForHealthy(containerId: String, timeout: Duration): Boolean
/**
* Get container resource usage statistics
* @param containerId Container to inspect
* @return ResourceStats with CPU, memory usage
*/
def getResourceStats(containerId: String): ResourceStatsPre-configured settings for supported database systems.
/**
* Get default configuration for a database type
* @param dbType Database type
* @return Default ContainerConfig for the database
*/
def getDefaultConfig(dbType: String): ContainerConfig
/**
* Get default environment variables for a database type
* @param dbType Database type
* @return Map of environment variables
*/
def getDefaultEnvVars(dbType: String): Map[String, String]
/**
* Get default port mapping for a database type
* @param dbType Database type
* @return Default port number
*/
def getDefaultPort(dbType: String): Int
/**
* Get JDBC driver class for a database type
* @param dbType Database type
* @return JDBC driver class name
*/
def getDriverClass(dbType: String): Stringcase class ContainerInfo(
containerId: String,
jdbcUrl: String,
hostPort: Int,
username: String,
password: String,
driverClass: String
)
case class ContainerConfig(
memoryLimit: String,
cpuLimit: Double,
portBindings: Map[Int, Int],
volumeMounts: Map[String, String],
networkMode: String
)
case class ContainerStatus(
containerId: String,
status: String,
isRunning: Boolean,
isHealthy: Boolean,
startedAt: Instant,
finishedAt: Option[Instant]
)
case class ResourceStats(
cpuUsagePercent: Double,
memoryUsageMB: Long,
memoryLimitMB: Long,
networkRxBytes: Long,
networkTxBytes: Long
)The container manager supports the following database systems:
Each database type has pre-configured default settings for container creation, environment variables, and connection parameters.