You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
provs/src/main/kotlin/io/provs/docker/platforms/UbuntuHostDocker.kt

93 lines
2.9 KiB
Kotlin

package io.provs.docker.platforms
import io.provs.*
import io.provs.docker.containerRuns
import io.provs.docker.dockerImageExists
import io.provs.docker.exitAndRmContainer
import io.provs.docker.images.DockerImage
import io.provs.platforms.UbuntuProv
import io.provs.processors.ContainerStartMode
fun UbuntuProv.provideContainerPlatform(
containerName: String,
imageName: String = "ubuntu",
startMode: ContainerStartMode = ContainerStartMode.USE_RUNNING_ELSE_CREATE
): ProvResult = requireLast {
if (startMode == ContainerStartMode.CREATE_NEW_KILL_EXISTING) {
exitAndRmContainer(containerName)
}
if ((startMode == ContainerStartMode.CREATE_NEW_KILL_EXISTING) || (startMode == ContainerStartMode.CREATE_NEW_FAIL_IF_EXISTING)) {
if (!cmd(
"sudo docker run -dit --name=$containerName $imageName"
).success
) {
throw RuntimeException("could not start docker")
}
} else if (startMode == ContainerStartMode.USE_RUNNING_ELSE_CREATE) {
val r =
cmd("sudo docker inspect -f '{{.State.Running}}' $containerName")
if (!r.success || "false\n" == r.out) {
cmd("sudo docker rm -f $containerName")
cmd("sudo docker run -dit --name=$containerName $imageName")
}
}
ProvResult(containerRuns(containerName))
}
fun UbuntuProv.containerRunsPlatform(containerName: String): Boolean {
return cmdNoEval("sudo docker inspect -f '{{.State.Running}}' $containerName").out?.equals("true\n") ?: false
}
fun UbuntuProv.runContainerPlatform(
containerName: String = "defaultProvContainer",
imageName: String = "ubuntu"
) = def {
cmd("sudo docker run -dit --name=$containerName $imageName")
}
fun UbuntuProv.containerExecPlatform(containerName: String, cmd: String) = def {
cmd("sudo docker exec $containerName $cmd")
}
fun UbuntuProv.containerShPlatform(containerName: String, cmd: String) = def {
containerExecPlatform(containerName, "sh -c \"${cmd.escapeDoubleQuote()}\"")
}
fun UbuntuProv.dockerBuildImagePlatform(image: DockerImage, skipIfExisting: Boolean): ProvResult {
if (skipIfExisting && dockerImageExists(image.imageName())) {
return ProvResult(true)
}
val path = hostUserHome() + "tmp_docker_img" + fileSeparator()
if (!xec("test", "-d", path).success) {
cmd("cd ${hostUserHome()} && mkdir tmp_docker_img")
}
cmd("cd $path && printf '${image.imageText().escapeSingleQuote()}' > Dockerfile")
return cmd("cd $path && sudo docker build --tag ${image.imageName()} .")
}
fun UbuntuProv.dockerImageExistsPlatform(imageName: String): Boolean {
return (cmd("sudo docker images $imageName -q").out != "")
}
fun UbuntuProv.exitAndRmContainerPlatform(
containerName: String
) = requireAll {
if (containerRuns(containerName)) {
cmd("sudo docker stop $containerName")
}
cmd("sudo docker rm $containerName")
}