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.
93 lines
2.9 KiB
Kotlin
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")
|
|
}
|