All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gesellix.gradle.docker.tasks.DockerRunTask.groovy Maven / Gradle / Ivy

package de.gesellix.gradle.docker.tasks

import de.gesellix.docker.client.EnvFileParser
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.TaskAction

class DockerRunTask extends GenericDockerTask {

    @Input
    def imageName
    @Input
    @Optional
    def tag = ""
    @Input
    @Optional
    def containerName = ""
    /**
     * Accepts a list of port mappings with the following pattern: `hostPort:containerPort`.
     * More sophisticated patterns are only supported via plain containerConfig.
     */
    @Input
    @Optional
    def ports = []
    @Input
    @Optional
    def containerConfiguration = [:]
    /**
     * @deprecated use #containerConfiguration.HostConfig
     */
    @Input
    @Optional
    @Deprecated
    def hostConfiguration = [:]
    @Input
    @Optional
    def env = []
    @Input
    @Optional
    def environmentFiles = []

    @Internal
    def envFileParser = new EnvFileParser()

    @Internal
    def result

    DockerRunTask() {
        description = "Run a command in a new container"
        group = "Docker"
    }

    @TaskAction
    def run() {
        logger.info "docker run"
        if (getHostConfiguration() != [:]) {
            throw new UnsupportedOperationException("please use `containerConfiguration.HostConfig`!")
        }
        def containerConfig = getActualContainerConfig()
        result = getDockerClient().run(
                getAsString(getImageName()),
                containerConfig,
                getAsString(getTag()),
                getAsString(getContainerName()),
                getAuthConfig())
        return result
    }

    static String getAsString(def closureOrString) {
        if (closureOrString instanceof Closure) {
            return (closureOrString as Closure)()
        }
        else {
            return closureOrString?.toString()
        }
    }

    @Internal
    def getActualContainerConfig() {
        def containerConfig = getContainerConfiguration() ?: [:]
        containerConfig.HostConfig = containerConfig.HostConfig ?: [:]
        if (getEnvironmentFiles()) {
            containerConfig.Env = containerConfig.Env ?: []
            getEnvironmentFiles().each { File file ->
                def parsedEnv = envFileParser.parse(file)
                containerConfig.Env.addAll(parsedEnv)
            }
        }
        if (getEnv()) {
            containerConfig.Env = containerConfig.Env ?: []
            getEnv().each {
                containerConfig.Env += it
            }
        }
        if (getPorts()) {
            containerConfig.ExposedPorts = containerConfig.ExposedPorts ?: [:]
            containerConfig.HostConfig.PortBindings = containerConfig.HostConfig.PortBindings ?: [:]
            getPorts().each { String portMapping ->
                // format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
                def splittedPortMapping = portMapping.split(":")
                if (splittedPortMapping.size() != 2) {
                    throw new UnsupportedOperationException("please use the plain `containerConfig.ExposedPorts and containerConfig.HostConfig.PortBindings` properties")
                }
                def hostPort = splittedPortMapping[0]
                def containerPort = "${splittedPortMapping[1]}/tcp".toString()
                containerConfig.ExposedPorts[containerPort] = [:]
                containerConfig.HostConfig.PortBindings[containerPort] = [[HostIp  : "0.0.0.0",
                                                                           HostPort: hostPort]]
            }
        }
        logger.info "effective container config: ${containerConfig}"
        return containerConfig
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy