
com.github.j5ik2o.dockerController.DockerComposeController.scala Maven / Gradle / Ivy
package com.github.j5ik2o.dockerController
import com.github.dockerjava.api.DockerClient
import com.github.dockerjava.api.command.CreateContainerCmd
import com.github.dockerjava.api.model.HostConfig.newHostConfig
import com.github.dockerjava.api.model.{ AccessMode, Bind, SELContext, Volume }
import org.apache.commons.io.FileUtils
import org.seasar.util.io.ResourceUtil
import java.io.File
import java.nio.file.StandardCopyOption
import scala.concurrent.duration.{ DurationInt, FiniteDuration }
object DockerComposeController {
def apply(dockerClient: DockerClient, outputFrameInterval: FiniteDuration = 500.millis)(
dockerComposeWorkingDir: File,
ymlResourceName: String,
environmentNames: Seq[String],
context: Map[String, AnyRef]
): DockerController =
new DockerComposeController(dockerClient, outputFrameInterval)(
dockerComposeWorkingDir,
ymlResourceName,
environmentNames,
context
)
}
private[dockerController] class DockerComposeController(
dockerClient: DockerClient,
outputFrameInterval: FiniteDuration = 500.millis
)(
val dockerComposeWorkingDir: File,
val ymlResourceName: String,
val environmentResourceNames: Seq[String],
val context: Map[String, AnyRef]
) extends DockerControllerImpl(dockerClient, outputFrameInterval)("docker/compose", Some("1.24.1")) {
override protected def newCreateContainerCmd(): CreateContainerCmd = {
val id = Base58.randomString(16)
if (!dockerComposeWorkingDir.exists()) dockerComposeWorkingDir.mkdir()
val ymlFile = if (ymlResourceName.endsWith(".ftl")) {
val file = new File(dockerComposeWorkingDir, s"docker-compose-$id.yml")
DockerComposeFileGen.generate(ymlResourceName, context + ("id" -> id), file)
file
} else {
val srcFile = ResourceUtil.getResourceAsFile(ymlResourceName)
val destFile = new File(dockerComposeWorkingDir, srcFile.getName)
FileUtils.copyFile(srcFile, destFile, StandardCopyOption.REPLACE_EXISTING)
destFile
}
environmentResourceNames.foreach { environmentResourceName =>
if (environmentResourceName.endsWith(".ftl")) {
val Array(base, ext, _) = environmentResourceName.split("\\.")
val file = new File(dockerComposeWorkingDir, s"$base-$id.$ext")
DockerComposeFileGen.generate(environmentResourceName, context, file)
} else {
val srcFile = ResourceUtil.getResourceAsFile(environmentResourceName)
val destFile = new File(dockerComposeWorkingDir, srcFile.getName)
FileUtils.copyFile(srcFile, destFile, StandardCopyOption.REPLACE_EXISTING)
}
}
val baseDir = ymlFile.getParentFile
val bind = new Bind(baseDir.getPath, new Volume(baseDir.getPath), AccessMode.ro, SELContext.none)
val systemBind = new Bind("/var/run/docker.sock", new Volume("/docker.sock"), AccessMode.rw, SELContext.none)
logger.debug(s"ymlFile = ${ymlFile.getName}")
super
.newCreateContainerCmd()
.withCmd("up")
.withEnv(s"COMPOSE_FILE=${ymlFile.getName}", "DOCKER_HOST=unix:///docker.sock")
.withWorkingDir(baseDir.getPath)
.withHostConfig(
newHostConfig()
.withBinds(bind, systemBind)
)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy