|
| 1 | +package com.github.j5ik2o.dockerController.postgresql |
| 2 | + |
| 3 | +import com.github.dockerjava.api.DockerClient |
| 4 | +import com.github.dockerjava.api.command.CreateContainerCmd |
| 5 | +import com.github.dockerjava.api.model.HostConfig.newHostConfig |
| 6 | +import com.github.dockerjava.api.model.{ ExposedPort, Ports } |
| 7 | +import com.github.j5ik2o.dockerController.DockerControllerImpl |
| 8 | +import com.github.j5ik2o.dockerController.postgresql.PostgreSQLController.{ |
| 9 | + DefaultContainerPort, |
| 10 | + DefaultImageName, |
| 11 | + DefaultImageTag |
| 12 | +} |
| 13 | + |
| 14 | +import scala.concurrent.duration._ |
| 15 | + |
| 16 | +object PostgreSQLController { |
| 17 | + final val DefaultImageName: String = "postgres" |
| 18 | + final val DefaultImageTag: Option[String] = Some("13") |
| 19 | + final val DefaultContainerPort: Int = 5432 |
| 20 | + |
| 21 | + def apply( |
| 22 | + dockerClient: DockerClient, |
| 23 | + outputFrameInterval: FiniteDuration = 500.millis, |
| 24 | + imageName: String = DefaultImageName, |
| 25 | + imageTag: Option[String] = DefaultImageTag, |
| 26 | + envVars: Map[String, String] = Map.empty |
| 27 | + )( |
| 28 | + hostPort: Int, |
| 29 | + userName: String, |
| 30 | + password: Option[String] = None, |
| 31 | + databaseName: Option[String] = None, |
| 32 | + initDbArgs: Option[String] = None, |
| 33 | + initDbWalDir: Option[String] = None, |
| 34 | + hostAuthMethod: Option[String] = None, |
| 35 | + pgData: Option[String] = None |
| 36 | + ): PostgreSQLController = |
| 37 | + new PostgreSQLController(dockerClient, outputFrameInterval, imageName, imageTag, envVars)( |
| 38 | + hostPort, |
| 39 | + userName, |
| 40 | + password, |
| 41 | + databaseName, |
| 42 | + initDbArgs, |
| 43 | + initDbWalDir, |
| 44 | + hostAuthMethod, |
| 45 | + pgData |
| 46 | + ) |
| 47 | +} |
| 48 | + |
| 49 | +class PostgreSQLController( |
| 50 | + dockerClient: DockerClient, |
| 51 | + outputFrameInterval: FiniteDuration = 500.millis, |
| 52 | + imageName: String = DefaultImageName, |
| 53 | + imageTag: Option[String] = DefaultImageTag, |
| 54 | + envVars: Map[String, String] = Map.empty |
| 55 | +)( |
| 56 | + hostPort: Int, |
| 57 | + userName: String, |
| 58 | + password: Option[String] = None, |
| 59 | + databaseName: Option[String] = None, |
| 60 | + initDbArgs: Option[String] = None, |
| 61 | + initDbWalDir: Option[String] = None, |
| 62 | + hostAuthMethod: Option[String] = None, |
| 63 | + pgData: Option[String] = None |
| 64 | +) extends DockerControllerImpl(dockerClient, outputFrameInterval)(imageName, imageTag) { |
| 65 | + |
| 66 | + private val environmentVariables: Map[String, String] = { |
| 67 | + envVars ++ |
| 68 | + Map[String, String]( |
| 69 | + "POSTGRES_USER" -> userName |
| 70 | + ) ++ |
| 71 | + password.map(s => Map("POSTGRES_PASSWORD" -> s)).getOrElse(Map.empty) ++ |
| 72 | + databaseName.map(s => Map("POSTGRES_DB" -> s)).getOrElse(Map.empty) ++ |
| 73 | + initDbArgs.map(s => Map("POSTGRES_INITDB_ARGS" -> s)).getOrElse(Map.empty) ++ |
| 74 | + initDbWalDir.map(s => Map("POSTGRES_INITDB_WALDIR" -> s)).getOrElse(Map.empty) ++ |
| 75 | + hostAuthMethod.map(s => Map("POSTGRES_HOST_AUTH_METHOD" -> s)).getOrElse(Map.empty) ++ |
| 76 | + pgData.map(s => Map("PGDATA" -> s)).getOrElse(Map.empty) |
| 77 | + } |
| 78 | + |
| 79 | + override protected def newCreateContainerCmd(): CreateContainerCmd = { |
| 80 | + val containerPort = ExposedPort.tcp(DefaultContainerPort) |
| 81 | + val portBinding = new Ports() |
| 82 | + portBinding.bind(containerPort, Ports.Binding.bindPort(hostPort)) |
| 83 | + super |
| 84 | + .newCreateContainerCmd() |
| 85 | + .withEnv(environmentVariables.map { case (k, v) => s"$k=$v" }.toArray: _*) |
| 86 | + .withExposedPorts(containerPort) |
| 87 | + .withHostConfig(newHostConfig().withPortBindings(portBinding)) |
| 88 | + } |
| 89 | +} |
0 commit comments