{"id":15127729,"url":"https://github.com/j5ik2o/docker-controller-scala","last_synced_at":"2025-10-23T06:30:24.272Z","repository":{"id":37049995,"uuid":"353932626","full_name":"j5ik2o/docker-controller-scala","owner":"j5ik2o","description":null,"archived":false,"fork":false,"pushed_at":"2024-10-28T14:43:15.000Z","size":886,"stargazers_count":15,"open_issues_count":7,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-29T20:33:41.506Z","etag":null,"topics":["docker-container","docker-java","scalatest"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/j5ik2o.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-02T06:49:32.000Z","updated_at":"2024-07-05T22:46:16.000Z","dependencies_parsed_at":"2024-02-05T23:32:32.456Z","dependency_job_id":"1c97a70c-eba5-41d4-9e03-2b94a907966b","html_url":"https://github.com/j5ik2o/docker-controller-scala","commit_stats":null,"previous_names":[],"tags_count":615,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j5ik2o%2Fdocker-controller-scala","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j5ik2o%2Fdocker-controller-scala/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j5ik2o%2Fdocker-controller-scala/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j5ik2o%2Fdocker-controller-scala/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/j5ik2o","download_url":"https://codeload.github.com/j5ik2o/docker-controller-scala/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237784864,"owners_count":19365944,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker-container","docker-java","scalatest"],"created_at":"2024-09-26T02:05:20.260Z","updated_at":"2025-10-23T06:30:24.266Z","avatar_url":"https://github.com/j5ik2o.png","language":"Scala","readme":"# docker-controller-scala\n\n[![Actions Status: CI](https://github.com/j5ik2o/docker-controller-scala/workflows/CI/badge.svg)](https://github.com/j5ik2o/docker-controller-scala/actions?query=workflow%3A\"CI\")\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.j5ik2o/docker-controller-scala-core_2.13/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.j5ik2o/docker-controller-scala-core_2.13)\n[![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com)\n[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![Tokei](https://tokei.rs/b1/github/j5ik2o/event-store-adapter-scala)](https://github.com/XAMPPRocky/tokei)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fj5ik2o%2Fdocker-controller-scala.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fj5ik2o%2Fdocker-controller-scala?ref=badge_shield)\n\nThis library provides an easy and simple way to handle Docker Container or Docker Compose on ScalaTest, based on [docker-java](https://github.com/docker-java/docker-java). The implementation of this library is thin, and if you know [docker-java](https://github.com/docker-java/docker-java), your learning cost will be negligible.\n\nM1 Macs also be supported.\n\n## Installation\n\nAdd the following to your sbt build (2.12.x, 2.13.x, 3.0.x):\n\n```scala\nval version = \"...\"\n\nlibraryDependencies += Seq(\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-core\" % version,\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-scalatest\" % version, // for scalatest\n  // RDB\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-mysql\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-postgresql\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-flyway\" % version, // optional\n  // NoSQL\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-memcached\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-redis\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-elasticsearch\" % version, // optional\n  // Kafka\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-zookeeper\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-kafka\" % version, // optional\n  // AWS Services\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-dynamodb-local\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-minio\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-localstack\" % version, // optional\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-elasticmq\" % version, // optional\n)\n```\n\nIn most cases, you can just select the scalatest module and the module you need.\n\n```scala\nlibraryDependencies += Seq(\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-scalatest\" % version,\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-mysql\" % version,\n)\n```\n\n## Usage\n\n[DockerController](docker-controller-scala-core/src/main/scala/com/github/j5ik2o/dockerController/DockerController.scala) that the thin wrapper for [docker-java](https://github.com/docker-java/docker-java) controls Docker Image and Docker Container for testing.\n\n### How to test with preset DockerController\n\nThe `DockerController` for the corresponding preset is as follows. Please see the corresponding `**Spec` for specific usage.\n\n- RDBMS\n  - [MySQLController](docker-controller-scala-mysql/src/main/scala/com/github/j5ik2o/dockerController/mysql/MySQLController.scala) / [MySQLControllerSpec](docker-controller-scala-mysql/src/test/scala/com/github/j5ik2o/dockerController/MySQLControllerSpec.scala)\n  - [PostgreSQLController](docker-controller-scala-postgresql/src/main/scala/com/github/j5ik2o/dockerController/postgresql/PostgreSQLController.scala) / [PostgreSQLControllerSpec](docker-controller-scala-postgresql/src/test/scala/com/github/j5ik2o/dockerController/postgresql/PostgreSQLControllerSpec.scala)\n- NoSQL\n  - [MemcachedController](docker-controller-scala-memcached/src/main/scala/com/github/j5ik2o/dockerController/memcached/MemcachedController.scala) / [MemcachedControllerSpec](docker-controller-scala-memcached/src/test/scala/com/github/j5ik2o/dockerController/memcached/MemcachedControllerSpec.scala)\n  - [RedisController](docker-controller-scala-redis/src/main/scala/com/github/j5ik2o/dockerController/redis/RedisController.scala) / [RedisControllerSpec](docker-controller-scala-redis/src/test/scala/com/github/j5ik2o/dockerController/redis/RedisControllerSpec.scala)\n  - [ElasticsearchController](docker-controller-scala-elasticsearch/src/main/scala/com/github/j5ik2o/dockerController/elasticsearch/ElasticsearchController.scala) / [ElasticsearchControllerSpec](docker-controller-scala-elasticsearch/src/test/scala/com/github/j5ik2o/dockerController/elasticsearch/ElasticsearchControllerSpec.scala)\n  - [ZooKeeperController](docker-controller-scala-zookeeper/src/main/scala/com/github/j5ik2o/dockerController/zooKeeper/ZooKeeperController.scala) / [ZooKeeperControllerSpec](docker-controller-scala-zookeeper/src/test/scala/com/github/j5ik2o/dockerController/ZooKeeperControllerSpec.scala)\n  - [KafkaController](docker-controller-scala-kafka/src/main/scala/com/github/j5ik2o/dockerController/kafka/KafkaController.scala) / [KafkaControllerSpec](docker-controller-scala-kafka/src/test/scala/com/github/j5ik2o/dockerController/kafka/KafkaControllerSpec.scala)\n- AWS Storages\n  - [LocalStackController](docker-controller-scala-localstack/src/main/scala/com/github/j5ik2o/dockerController/localstack/LocalStackController.scala) / [LocalStackControllerSpec](docker-controller-scala-localstack/src/test/scala/com/github/j5ik2o/dockerController/localstack/LocalStackControllerSpec.scala)\n  - [DynamoDBLocalController](docker-controller-scala-dynamodb-local/src/main/scala/com/github/j5ik2o/dockerController/dynamodbLocal/DynamoDBLocalController.scala) / [DynamoDBLocalControllerSpec](docker-controller-scala-dynamodb-local/src/test/scala/com/github/j5ik2o/dockerController/dynamodbLocal/DynamoDBLocalControllerSpec.scala)\n  - [MinioController](docker-controller-scala-minio/src/main/scala/com/github/j5ik2o/dockerController/minio/MinioController.scala) / [MinioControllerSpec](docker-controller-scala-minio/src/test/scala/com/github/j5ik2o/dockerController/minio/MinioControllerSpec.scala)\n  - [ElasticMQController](docker-controller-scala-elasticmq/src/main/scala/com/github/j5ik2o/dockerController/elasticmq/ElasticMQController.scala) / [ElasticMQControllerSpec](docker-controller-scala-elasticmq/src/test/scala/com/github/j5ik2o/dockerController/elasticmq/ElasticMQControllerSpec.scala)\n\n### Use Flyway Migrate Command on MySQL/PostgreSQL\n\nIf you'd like to use `flyway` module, you can use `docker-controller-scala-flyway`.\n\n```scala\nlibraryDependencies += Seq(\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-scalatest\" % version,\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-mysql\" % version,\n  \"io.github.j5ik2o\" %% \"docker-controller-scala-flyway\" % version, // for flyway\n)\n```\n\nMix-in `FlywaySpecSupport` then, put the sql files in `src/resources/flyway`(`src/resources/**` can be set to any string.), run `flywayContext.flyway.migrate()` in `afterStartContainers` method.\n\n### How to test with DockerController your customized\n\nTo launch a docker container for testing\n\n```scala\n// In ScalaTest, please mix-in DockerControllerSpecSupport.\nclass NginxSpec extends AnyFreeSpec with DockerControllerSpecSupport {\n  \n  // choose whether to create and destroy containers per test class (ForAllTest) or per test (ForEachTest).\n  override def createRemoveLifecycle: DockerContainerCreateRemoveLifecycle.Value =\n    DockerContainerCreateRemoveLifecycle.ForEachTest\n\n  // choose whether to start and stop containers per test class (ForAllTest) or per test (ForEachTest).\n  override def startStopLifecycle: DockerContainerStartStopLifecycle.Value =\n    DockerContainerStartStopLifecycle.ForEachTest\n    \n  val nginx: DockerController = DockerController(dockerClient)(\n    imageName = \"nginx\",\n    tag = Some(\"latest\")\n  ).configureCreateContainerCmd { cmd =\u003e\n    // if customize the container generation, please do the following.\n    // In this example, a random host port is specified.\n    val hostPort: Int              = temporaryServerPort()\n    val containerPort: ExposedPort = ExposedPort.tcp(80)\n    val portBinding: Ports         = new Ports()\n    portBinding.bind(containerPort, Ports.Binding.bindPort(hostPort))\n    logger.debug(s\"hostPort = $hostPort, containerPort = $containerPort\")\n    cmd\n      .withExposedPorts(containerPort)\n      .withHostConfig(newHostConfig().withPortBindings(portBinding))\n  }\n\n  // Specify DockerControllers to be launched.\n  override protected val dockerControllers: Vector[DockerController] = {\n    Vector(nginx)\n  }\n\n  // Set the condition to wait for the container to be started.\n  override protected val waitPredicatesSettings: Map[DockerController, WaitPredicateSetting] =\n    Map(\n      nginx -\u003e WaitPredicateSetting(\n        Duration.Inf,\n        WaitPredicates.forLogMessageContained(\"Configuration complete; ready for start up\")\n      )\n    )\n\n  \"nginx\" - {\n    \"run-1\" in {\n      val hostPort = nginx.inspectContainer().getNetworkSettings.bindingHostPort(ExposedPort.tcp(80)).get\n      val url      = new URL(s\"http://$dockerHost:$hostPort\")\n      HttpRequestUtil.wget(url)\n    }\n    \"run-2\" in {\n      val hostPort = nginx.inspectContainer().getNetworkSettings.bindingHostPort(ExposedPort.tcp(80)).get\n      val url      = new URL(s\"http://$dockerHost:$hostPort\")\n      HttpRequestUtil.wget(url)\n    }\n  }\n}\n```\n\n### How to use Docker Compose\n\n- Place the `docker-compose.yml.ftl`(ftl is Freemarker template) in `src/test/resources`. `docker-compose.yml.ftl` can be renamed to anything you want.\n- The variables in the ftl can be freely determined.\n\n```yaml\nversion: '3'\nservices:\n  nginx:\n    image: nginx\n    ports:\n      - ${nginxHostPort}:80\n```\n\n- Use `DockerComposeController`, which is a subtype of `DockerController`. Other than this, it is the same as the test method above.\n- Pass the context containing the values of the variables to be used in the FTL to the constructor of `DockerComposeController`.\n\n```scala\nclass NginxSpec extends AnyFreeSpec with DockerControllerSpecSupport {\n// ...\n  val buildDir: File                = ResourceUtil.getBuildDir(getClass)\n  val dockerComposeWorkingDir: File = new File(buildDir, \"docker-compose\")\n  val dockerController = DockerComposeController(dockerClient)(\n    dockerComposeWorkingDir,\n    \"docker-compose.yml.ftl\",\n    Map(\"nginxHostPort\" -\u003e hostPort.toString)\n  )\n\n  override val dockerControllers: Vector[DockerController] = {\n    Vector(dockerController)\n  }\n// ...\n}     \n```\n\n\n## License\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fj5ik2o%2Fdocker-controller-scala.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fj5ik2o%2Fdocker-controller-scala?ref=badge_large)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj5ik2o%2Fdocker-controller-scala","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fj5ik2o%2Fdocker-controller-scala","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj5ik2o%2Fdocker-controller-scala/lists"}